非常に重い大きなログファイルを毎日生成するアプリケーションがあるので(1日あたり約800MB)、それらを圧縮する必要がありますが、圧縮には時間がかかるため、アプリケーションにHUP信号を再読み込み/送信した後、logrotateでファイルを圧縮します。
/var/log/myapp.log {
rotate 7
size 500M
compress
weekly
postrotate
/bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
ポストローテーションの後に圧縮が行われるのはすでに事実ですか(これは直感に反するでしょう)。そうでない場合、追加のコマンドスクリプト(オプションまたはいくつかのトリック)なしでそれを行うことが可能であるかどうか誰もが教えてもらえますか?
ありがとうThomas
postrotate
スクリプトは、圧縮が発生する前に実行されます。manページから logrotate
構成ファイルの次のセクションでは、ログファイル/ var/log/messagesの処理方法を定義しました。ログは、削除される前に週に5回ローテーションされます。ログファイルがローテーションされた後(ただし、古いバージョンのログが圧縮される前)、コマンド/ sbin/killall -HUP syslogdが実行されます。
いずれの場合も、delaycompress
オプションを使用して、圧縮を次のローテーションまで延期できます。
圧縮が完了した後でファイルに対してスクリプトを実行する方法を実際に検索しているときにこのスレッドに出くわす人がいる場合に、この情報をここに追加します。
上で提案したように、postrotate/endscriptを使用することは、これには適していません。
代わりに、lastaction/endscriptを使用できます。これは完全に機能します。
postrotateスクリプトalways実行beforeの場合でも圧縮sharedscriptsが有効です。したがって、最初の答えに対するHasturkunの追加の応答は正しくありません。 sharedscriptsが有効な場合、postrotateの前に実行される唯一の圧縮はdelaycompressが原因で古い圧縮されていないログが横になっています。現在のログの場合、圧縮はalways実行afterpostrotateスクリプトを実行します。
@Hasturkun-評判が最初に50を超えない限り、コメントを追加することはできません。
Logrotateが何をするかを確認するには、
Postrotateに共有スクリプトを使用する構成
$ logrotate -d -f <logrotate.conf file>
次の手順を示します。
rotating pattern: /tmp/log/messages /tmp/log/maillog /tmp/log/cron
...
renaming /tmp/log/messages to /tmp/log/messages.1
renaming /tmp/log/maillog to /tmp/log/maillog.1
renaming /tmp/log/cron to /tmp/log/cron.1
running postrotate script
<kill-hup-script executed here>
compressing log with: /bin/gzip
compressing log with: /bin/gzip
compressing log with: /bin/gzip