Signals

為什麼在 RHEL 的 logrotate 中使用 kill -HUP?在所有情況下都需要嗎?

  • April 25, 2018

我看到 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 信號來重新打開它的文件句柄而不終止它自己。

引用自:https://unix.stackexchange.com/questions/440004