RHELでlogrotateがkill -HUPを使用するのはなぜですか?すべての場合に必要ですか?

RHELでlogrotateがkill -HUPを使用するのはなぜですか?すべての場合に必要ですか?

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を使用してサービスを再起動しないのはなぜですか?違いがありますか?

答え1

通常、サービスは実行中にログファイルを開いたままにします。つまり、ログファイルの名前が変更、移動、削除されても、気にせずに処理された開いたファイルに書き込みを続けます。

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信号を受信し、自分自身を終了せずにファイルハンドルを再び開きます。

答え2

ファイルを移動すると、そのファイルを開いたプログラムはまだ新しい場所で同じファイルを開き、古いログファイルに追加し続けます。必ずしもそれ自体を再起動するわけではありませんがkill -HUP(syslogの場合は該当しますが、独自のログを管理するcronデーモンの場合はログファイル自体を制御するだけです)、ファイルを閉じてファイルを開くようにすることもできます。名前で、これはスクリプトの重要な部分です。 syslogd を強制的に再起動することは、再起動時に syslogd サービスを使用できないことを意味しますが、syslogd が処理方法を知っている信号を使用すると、透過的に「再起動」するために必要なすべての操作を実行できます。

関連情報