web-dev-qa-db-ja.com

logrotatingの際の「postrotate invoke-rc.d rsyslog rotate」の目的、およびこのコマンドは古くなっていますか?

Logrotateを使用してログファイルを回転させ続けると、

postrotate
                invoke-rc.d rsyslog rotate > /dev/null
endscript

postrotateはログファイルのローテーション後にbashに次のコマンドを実行させることを知っていますが、このコマンドを正確に実行する目的は何ですか?

最後に、今では時代遅れですか? (anacronから「起動しようとしているスクリプトはUpstartジョブに変換されましたが、Upstartジョブでは回転はサポートされていません」というメッセージが表示されるようです。)

3
fpghost

私は同様の問題を抱えており、logrotateのrsyslog構成が壊れているようですので、実際に動作するservice rsyslog rotateを呼び出す代わりに、reload rsyslogなどを使用します。これは 実際にはバグ であり、バージョン 7.4.4-1ubuntu5 で修正されていますが、Ubuntu 14.04のインストールではバージョン 7.4.4 -1ubuntu2 apt.

これは私のために働いた修正です:

ファイル/etc/logrotate.d/rsyslogを編集し、postrotateブロック内の行(たとえば、reload rsyslogまたはinvoke-rc.d rsyslog rotate)を次のように置き換えます。

service rsyslog rotate >/dev/null 2>&1 || true

ブロックは次のようになります。

postrotate
    service rsyslog rotate >/dev/null 2>&1 || true
endscript

すべての周囲の線がそのまま維持されます。

最後のステップとして、コマンドを1回手動で実行することをお勧めします。

service rsyslog rotate

このコマンドの目的は、ログの書き込みに使用しているファイルをrsyslogに再度開かせることです。 logrotateが古いファイルを移動した後に使用されるため、rsyslogは新しいファイルへの書き込みを開始します。

例:rsyslogは、ほとんどのものを/ var/log/syslogに書き込みます。 logrotateが起動すると、このファイルを/var/log/syslog.1に移動し、新しい空の/ var/log/syslogを作成します。ただし、ご存知かもしれませんが(念のため)、rsyslogは/ var/log/syslogという名前のファイルに書き込みを行うのではなく、ファイルを初めて開いたときにファイル記述子に書き込みを行います。関連するファイル内を移動することができ、rsyslogはファイル記述子のみを知っているため、書き込みを続けます。/var/log/syslogを/var/log/syslog.1に移動すると、rsyslogは/var/log/syslog.1への書き込みを続けます。これは、ファイル記述子が指すためです。実際、ファイルを削除してもrsyslogは書き込みを続けます。これは、削除されたファイルがスペースを占有しているように見える場合に発生することです。ファイル記述子はまだ開かれているため、スペースは解放されません。これは、ファイルへの最後の参照が閉じられたときにのみ発生します。

「rotate」引数は、古いファイル記述子のリリースを強制し、ファイルを再度開く必要があることをrsyslogに伝えるためのものです。したがって、新しいファイル記述子を新しいファイルに取得し、古いファイル記述子を適切に破棄できます。

時代遅れであることに関しては、私は知りません。それがあなたの質問に私を導いたものですO :-)しかし、問題はupstart configがこのオプションを受け入れる準備ができていないことだと思います。私はこれをmanページから置き換えました:

kill -HUP $(cat /var/run/rsyslogd.pid)

とにかく、これは「回転」したものです。お役に立てば幸いです。

5
rsuarez