我在 Digital Ocean VPS 上运行 Ubuntu 14.04 LTS 和 nginx,偶尔会收到以下有关 cron 作业失败的电子邮件:
主题
cron 测试 -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
电子邮件的正文是:
/etc/cron.daily/logrotate:错误:为“/var/log/nginx/*.log”运行共享 postrotate 脚本时出错 run-parts:/etc/cron.daily/logrotate 退出,返回代码 1
关于如何解决这个问题有什么想法吗?
更新:
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
更新:
$ sudo invoke-rc.d nginx rotate
initctl: invalid command: rotate
Try `initctl --help' for more information.
答案1
后旋转操作似乎不正确
尝试
invoke-rc.d nginx reload >/dev/null 2>&1
如果您查看该nginx
命令,您将看到它将接受的操作。您收到的消息还说检查initctl --help
xtian@fujiu1404:~/tmp$ initctl help
Job commands:
start Start job.
stop Stop job.
restart Restart job.
reload Send HUP signal to job.
status Query status of job.
list List known jobs.
因此重新加载应该可以工作并向 nginx 发送 HUP 信号以强制重新打开日志文件。
答案2
正如另一个答案中提到的,问题是invoke-rc.d nginx rotate
返回一个错误,指出rotate
不支持该操作。有趣的是,它service nginx rotate
运行起来没有任何问题。
我的猜测是invoke-rc.d
包装器不支持实际 nginx init 脚本支持的所有操作。
更改invoke-rc.d nginx rotate
为service nginx rotate
应该可以解决问题。
答案3
我不确定它是否因为initctl
不支持该rotate
选项,以及它何时被删除,但您并不是唯一受此影响的人,并且在启动板上有针对此问题的开放错误报告。
正如上面和下面的其他答案提到的,您可以编辑 nignx logrotate 文件并替换有问题的行
invoke-rc.d nginx reload >/dev/null 2>&1
与其他有效的替代方案,
start-stop-daemon --stop --signal USR1 --quiet --pidfile /run/nginx.pid --name nginx
# or
service nginx rotate >/dev/null 2>&1
# or
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
无论您选择什么方法,请注意您正在更改由包管理的文件,更改后,它不会再更新,您必须手动解决差异或用新的(已准备好包括修复程序)。
答案4
代替:
invoke-rc.d nginx reload >/dev/null 2>&1
和:
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
似乎在较新版本的 Nginx 上这有效。我正在运行1.9版本。