我在 Unix 和 Linux 中问过这个问题,但我认为它实际上更适合这里。
目前,我使用以下 logrotate.d 配置
/var/log/messages
{
daily
compress
rotate 7
postrotate
/bin/kill -HUP `cat /var/run/syslog-ng.pid 2> /dev/null` 2> /dev/null || true
endscript
}
然而,我在 syslog-ng 存储库中的官方 logrotate 示例中看到,他们没有执行 kill -HUP,而是执行了重新加载,例如:
/var/log/syslog.log {
rotate 7
daily
compress
postrotate
/etc/init.d/syslog-ng reload >/dev/null
endscript
}
这两种方法之间是否存在显著差异,导致他们的方法有效而我的方法无效,或者您认为存在其他问题?这是一个相当旧的 syslog-ng 版本,所以我不确定这是否也相关。
为了提供更多背景信息,下面是我版本的 syslog-ng 的 init 脚本中的重新加载功能。
reload()
{
verify_config
echo -n $"Reloading syslog-ng: "
killproc syslog-ng -HUP
RETVAL=$?
echo
return $RETVAL
}
当系统处于故障状态时,我确实检查了 lsof、可用内存等,并没有发现系统状态有任何过于可疑的情况。
答案1
该问题与 logrotate 无关,通过更新到较新的 syslog-ng 版本(至 3.9.1),该问题似乎已得到解决。我认为根本原因是服务器负载量导致的错误。我可以说这不是 postrotate 的问题,因为两个示例都成功重新加载了服务,而在旧版本上,在这两个示例之间进行更改最终并没有改变崩溃行为。