web-dev-qa-db-ja.com

オープン/ライブファイルでlogrotateせずに手動でログをローテーションするにはどうすればよいですか?

私のGoogle-Fuは私をとても近づけていますが、そこには完全ではありません。Linuxでは環境に配慮しすぎて、それらをまとめることができないと思います。

200GBを超える非常に大きなログファイルがありますが、まだ書き込まれています。 Logrotateは、ディスク容量が問題になる前に時間内に到達しません。また、構成内の他のすべてのターゲットに影響を与えたくないので、logrotateの別のラウンドを起動したくありません。 _logrotate.conf_ファイルに新しいスタンザを次のように追加しました。

_/log/myDevice/myDevice.log {
  compress
  daily
  rotate 360
  maxage 360
  missingok
  compresscmd /usr/bin/xz
  dateext
  compressext .xz
  copytruncate
  olddir /log/archive/myDevice
}
_

これらのことを手動で行いたいと思います。

  1. copytruncate:現在のログファイルを取得しますが、syslog-ngが現在のオープン/ライブファイルを引き続き処理できるようにします
  2. (logrotate.confの上にはない)split:現在のログロールを小さなチャンクに分割する
  3. xz:アーカイブフォルダに圧縮します

split(1)xz(1)は問題なく実行できますが、ターゲットファイルを取得しようとすると、サイコロが表示されません。

私は_Sudo mv myDevice.log ZmyDevice.log && touch myDevice.log_を試してみましたが、syslog-ngは元のファイル(およびその新しい名前)とともに移動するだけで、書き込みを楽にしてしまいます。 syslog-ngによってファイルがどのように参照されているかを考えたときから少し作りました。

だから私は、ファイルをある種の手動copytruncateを実行して、ファイルを「所定の場所」にある別のファイルにカットし、syslog-ngがそれを何にかじり続けるようにする方法を見つけようとしています。欲求。

3
Ceafin

ファイルを移動してから、SIGHUPをsyslog-ngプロセスに送信します。

殺す-HUP

これにより、開いているすべてのファイルが再度開かれ、移動/名前変更したファイルが解放され、続行できるようになります。次に、/ log/myDevice/myDevice.logを新しく開き、そこへの書き込みを開始します。

2
Craig Miskell

ファイルを開いているプロセスを見つけます:fuser /path/to/file。次に、kill -SIGSTOPを使用して、ファイルに書き込んでいるプロセスを一時停止します。次に、ファイルを回転し、コピーし、必要に応じて切り詰めてから、kill -SIGCONTを使用してプロセスを再開します。

0