Signals
為什麼在 RHEL 的 logrotate 中使用 kill -HUP?在所有情況下都需要嗎?
我看到 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 信號來重新打開它的文件句柄而不終止它自己。