cron 作业上的 nginx logrotate 错误

cron 作业上的 nginx logrotate 错误

我在 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 rotateservice 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版本。

相关内容