Logrotate:Docker + Nginx无法重新加载nginx容器logrotate:ALERT异常退出,显示为[1]

问题描述

我有一个 logrotate配置:

/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

所有工作都像魅力一样。

问题: 但是当cron自动旋转日志时,我得到了错误

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
}

终于可以了。

使用该参数之前,我必须了解该参数
我必须先了解该参数,然后再使用
我必须先了解参数

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...