日志旋转:Docker + nginx。无法重新加载 nginx 容器(logrotate:ALERT 异常退出 [1])
Logrotate: Docker + nginx. Can't reload nginx container (logrotate: ALERT exited abnormally with [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)。
如果我 运行 命令(作为 root)
# /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,等等)。
看起来像 postrotate nginx -s reopen
脚本失败。
Linux版本为CentOS 7。
SELinux 已禁用。
问题:
至少怎么知道从 cron logrotate 运行ning 时发生了什么?
可能是什么问题?
PS我知道我也可以用docker重启。但我不想这样做,因为服务短时间断开连接。
PS2 另外我知道这是配置中的 nocreate
参数。那是因为我想通过nginx创建新的日志文件(避免新文件权限错误)。无论如何,如果 nginx -s reopen
真的失败了,nginx 有可能不会重新读取新创建的文件。
编辑 1:
我编辑了 /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
}
终于成功了。
使用前必须了解参数
在使用它之前我必须了解参数
在使用它之前我必须了解参数
我有一个 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)。
如果我 运行 命令(作为 root)
# /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,等等)。
看起来像 postrotate nginx -s reopen
脚本失败。
Linux版本为CentOS 7。 SELinux 已禁用。
问题: 至少怎么知道从 cron logrotate 运行ning 时发生了什么? 可能是什么问题?
PS我知道我也可以用docker重启。但我不想这样做,因为服务短时间断开连接。
PS2 另外我知道这是配置中的 nocreate
参数。那是因为我想通过nginx创建新的日志文件(避免新文件权限错误)。无论如何,如果 nginx -s reopen
真的失败了,nginx 有可能不会重新读取新创建的文件。
编辑 1:
我编辑了 /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
}
终于成功了。
使用前必须了解参数
在使用它之前我必须了解参数
在使用它之前我必须了解参数