アプリケーションを終了せずにnohup.outファイルを回転させる方法


10

私のnohup.outファイルは急速に成長しています。

バックグラウンドでアプリケーションを実行していnohup.outます。ファイルを書き込んでいます。

nohup.out、私は私のアプリケーションを殺すことなくファイルを回転させる必要があります。これはできますか?


コピーしてから切り捨てます。
ジェニーD

彼は、あなたが提案したこれらの2つの操作の間にいくつかの貴重なログエントリを失う可能性があります。私はそれをお勧めしません。
Cleankod 2017年

回答:


5

と組み合わせてflogを確認する必要がありますlogrotate。これを介してアプリケーション出力をパイプSIGHUP処理すると、実行中のアプリケーションを強制終了することなく、flogプロセスを実行できます。

flog(ファイルロガー)は、STDINから入力を読み取り、ファイルに書き込むプログラムです。

SIGHUPを受信すると、ファイルが再度開かれ、ログのローテーションが可能になります[RHのlogrotate(8)を参照]。

ログファイルは、flogがローテーションの発生(つまり、古いファイルがなくなったかiノードが変更された)を検出した場合にのみ、再度開かれます。flogは非常に小さい(500バイト未満のメモリフットプリント)。


nohupはnohup.outの代わりにパイプを使用できますか?
ブライアンミントン2018

1
あなたはmanページごとにnohup.out以外のファイルに出力する(>)ファイルのリダイレクトを使用することができますTo save output to FILE, use 'nohup COMMAND > FILE'
jas_raj

4

回転できません。コマンド>nohup.outでそれを切り捨てることができます。これにより、ファイル内のすべてのコンテンツが削除されます。

出力を保存する必要がある場合は、最初にファイルをコピーしてから切り捨てることができます。しかし、レース用の小さなウィンドウがあり、ファイルをコピーした後、切り捨てる前に出力を書き込むことができます。そのウィンドウの間に書き込まれた出力は、永久に失われます。


1
ファイルハンドルが閉じられるまで、切り捨てによってディスク上の領域が解放されることはないと思います。
symcbean 2014

@symcbeanあなたの信念は正しくありません。ファイルを切り捨てると、すぐにスペースが解放されます。
kasperd 2014

Logrotate copytruncateがうまくいくはずです。
user9517 14

私が説明する手順@Iainと同等であるcopytruncateの中でlogrotate。ただしnohup.out、cronジョブをローテーションするように構成するファイルの種類はほとんどありません。
kasperd 2014

2

できません。

ファイル(rm)のリンクを解除できますが、データにはまだディスク上のフットプリントがあり、開いているファイルハンドルがある限り、引き続き書き込まれます。

ファイルの名前を変更できますが、これでもファイルへの書き込みは停止されません(ただし、バックグラウンドジョブを定期的に開始している場合、新しいジョブは同じファイルに書き込みます)。

実際には、ジョブの出力を、これを処理するために設計されたもの(apache rotatelogsなど)に明示的にリダイレクトする必要があります。


logrotate copytruncate誰か?
user9517 14

これは、nohupがnohup.outに行ごとに追加するか、それともnohup.outの場所へのポインタを保持するかによって完全に異なります。例については、serverfault.com / questions / 221337 /…を参照してください。
pepoluan 2014

1

Logrotateには、通常のローテーション(および設定されている場合は圧縮)スキームにコピーされた後、指定されたファイルを切り捨てる(空にする)copytruncateオプションがあります。

   copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

logrotateマンページから。


1

あなたはこのようなことをすることができます:

cp nohup.out nohup.out.save # save it somewhere
echo "" > nohup.out

アプリを強制終了する必要はありません。


1

これで遅すぎるかどうかわからない。しかし、このフォーラムに出くわした他の人たちにとって、私はflogや何かで何も試す必要がありませんでした。

私の仕事は次のように始まります:

nohup <my process> &

これで私の仕事が始まり、そのディレクトリのnohup.outに追加が始まります。

私がしなければならなかったのは、通常ディストリビューションに付属するlogrotateをセットアップし、このように構成することだけでした /etc/logrotate.conf

~/my abosolute path/nohup.out {
    size 1024k
    copytruncate
    rotate 100
    maxage 100
}

そしてそれはうまくいった!nohup.outは、同じファイルの新しいアペンドを取得中に切り捨てられていました。プロセスも死ななかった。そして、nohup.out-20190528このような新しいnohup.out が作成されました。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.