问题描述
/opt/docker_folders/logs/Nginx/*.log {
dateext
daily
rotate 31
nocreate
missingok
notifempty
nocompress
postrotate
/usr/bin/docker exec -it Nginx-container-name Nginx -s reopen > /dev/null 2>/dev/null
endscript
su docker_Nginx root
}
文件夹权限:
drwxrwxr-x. 2 docker_Nginx root 4096 Oct 13 10:22 Nginx
Nginx
是安装到Docker容器的本地主机文件夹。docker_Nginx
是与容器内的Nginx
用户具有相同uid的用户(uid:101)。
如果我以根用户身份运行命令
# /sbin/logrotate -v /etc/logrotate.d/Nginx_logrotate_config
# /sbin/logrotate -d -v /etc/logrotate.d/Nginx_logrotate_config
# /sbin/logrotate -d -f -v /etc/logrotate.d/Nginx_logrotate_config
所有工作都像魅力一样。
logrotate: ALERT exited abnormally with [1]
在/var/log/messages
结果日志照常旋转,但是Nginx不会创建新文件(access.log等)。
看起来后旋转Nginx -s reopen
脚本失败。
Linux版本是CentOS 7。 SELinux已禁用。
问题: 至少如何知道从cron运行logrotate时发生了什么? 可能是什么问题?
PS我知道我也可以使用docker restart。但由于服务中断时间短,我不想这样做。
PS2另外,我知道这是配置中的nocreate
参数。那是因为我想通过Nginx创建新的日志文件(以避免对新文件的错误权限)。无论如何,如果Nginx -s reopen
确实失败了,Nginx可能不会重新读取新创建的文件。
EDIT1:
我编辑了/etc/cron.daily/logrotate
脚本并获取了日志。
关于问题只有一行。
error: error running non-shared postrotate script for /opt/docker_folders/logs/Nginx/access.log of '/opt/docker_folders/logs/Nginx/*.log '
所以我仍然不明白是什么原因导致此问题...当我手动运行此脚本时,一切运行正常。
解决方法
好的。自己回答。
-it
参数不能用于cron任务(并且logrotate也是cron任务)。
因为cron没有交互式会话(TTY)。
我通过将/usr/bin/docker exec -it nginx-container-name nginx -s reopen > /dev/null 2>/dev/null
作为cron任务来解决这个问题。我收到错误消息"The input device is not a TTY"
所以我的新logrotate配置看起来像
/opt/docker_folders/logs/nginx/*.log {
dateext
daily
rotate 31
nocreate
missingok
notifempty
nocompress
postrotate
/usr/bin/docker exec nginx-container-name /bin/sh -c '/usr/sbin/nginx -s reopen > /dev/null 2>/dev/null'
endscript
su docker_nginx root
}
终于可以了。
使用该参数之前,我必须了解该参数
我必须先了解该参数,然后再使用
我必须先了解参数