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
}
SyslogのようなデーモンがSIGHUPをキャッチすると、それ自体が再起動しようとするため、-HUPが使用されることを理解しました。これにより、すべてのオープンファイルが更新されます。
なぜリフレッシュする必要があるのか分かりません。
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に書き込みを続けます。
HUP信号をcrondに送信すると、彼は既存のファイルハンドルを閉じ、新しいファイルハンドルを元のパス/var/log/cron.logに開かせ、新しいファイルを作成します。
別の信号の代わりにHUP信号を使用するかどうかは、プログラムの裁量に任されています。 php-fpmなどの一部のサービスは、USR1シグナルをリッスンして、自身を終了せずにファイルハンドルを再度開きます。
ファイルを移動しても、そのファイルを開いていたプログラムは新しい場所で同じファイルを開いたままであり、古いログファイルに追加され続けます。 kill -HUP
は必ずしもそれ自体を再起動させるわけではありません(syslogの場合は再起動しますが、たとえば独自のログを管理するcronデーモンの場合は、単にログファイル自体を制御します)。ただし、ファイルを閉じてファイルを開くだけです。 名前による、これはこのスクリプトの重要な部分です。 syslogdのハードリスタートを実行すると、syslogdが処理方法を認識している信号を使用して、「リスタート」を透過的にするために必要なことをすべて実行できる一方で、syslogdは再起動の実行中は使用できなくなります。