我看到 syslog 日志记录使用了 kill -HUP。
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
我知道使用 -HUP 是因为像 syslog 这样的守护进程在捕获 SIGHUP 时会尝试自行重启,因此所有打开的文件都会被刷新。
我不明白为什么他们需要刷新。
如果 syslog 仅将新日志附加到日志文件,则打开的文件将处于写入模式。如果是这种情况,当日志切换发生并且在文件系统中的旧日志文件条目被删除时,它不会在需要附加新日志行时自动创建新文件(毕竟 syslog服务以root身份运行)?
我认为区别更多在于对 w 和 u 模式的理解。我无法快速得出结论。
另外,为什么只使用kill -HUP,为什么不重新启动服务。会有什么不同吗?
通常,服务在运行时会保持打开日志文件。这意味着他们不关心日志文件是否被重命名/移动或删除,他们将继续写入已处理的打开文件。
当 logrotate 移动文件时,服务会继续写入同一个文件。
示例:crond 将写入 /var/log/cron.log。然后 logrotate 会将文件重命名为 /var/log/cron.log.1,因此 crond 将继续写入打开的文件 /var/log/cron.log.1。
向 crond 发送 HUP 信号将强制他关闭现有文件句柄并打开原始路径 /var/log/cron.log 的新文件句柄,这将创建一个新文件。
使用 HUP 信号而不是另一个信号由程序自行决定。像 php-fpm 这样的一些服务会监听 USR1 信号来重新打开它的文件句柄而不终止它自己。
当您移动文件时,打开该文件的程序仍会在新位置打开相同的文件,并将继续附加到旧日志文件。
kill -HUP
不一定会让它重新启动(对于 syslog 它确实如此,但对于例如管理自己的日志的 cron 守护进程,它只是控制日志文件本身),但可能只是导致它关闭文件并通过以下方式打开文件name,这是这个脚本的重要部分。对 syslogd 进行硬重启也意味着在重启过程中 syslog 服务不可用,而使用 syslogd 知道如何处理的信号允许它为“重启”透明执行所需的任何操作。