出力リダイレクトが中断されないようにプロセスを安全にシャットダウンする方法は?

出力リダイレクトが中断されないようにプロセスを安全にシャットダウンする方法は?

一部のプロセスを終了する必要がある自動化スクリプトを作成しています。

以前は主にプロセスを終了しましたが、一度はいくつかのプロセスを終了したkill -9 pidときに次のような事実を見つけました。kill -9tcpdump

たとえば、

tcpdump -i eth0 -w output.pcap

キャッチバッグは入れずにoutput.pcap空いていた。しかし、使用するとkill素晴らしい動作します。

たとえば、一部のプロセスでは、killプロセスを./prog >> test_log使用するとkill -9出力がリダイレクトされませんtest_log

killまた、killコマンドを使用しないと使用に-9失敗する可能性があるという心配もあります。

kill殺すことは、出力ファイルに問題を引き起こすことなく、問題なくプロセスを殺すために正しく使用する方法を教えてくれますか?

答え1

プロセスが端末に書き込まずにリダイレクトを使用している場合(または明示的にファイルに書き込む場合でも)、バッファリングが問題になる可能性があります。stdbufunbuffer()を確認するexpectか、ここで検索してください。

このフラグを使用すると、問題tcpdumpを解決または減らすことができます-U

一般的に言えば、次のように殺す必要があります。

kill $PID; sleep $wait; kill -9 $pid &>/dev/null

kill/は、メモリとプロセスのリストからプロセスを削除するkill -TERMのではなく、プロセスをきちんと完了する機会を提供します(たとえば、バッファフラッシュやファイルディスクリプタを閉じるなど)kill -KILL。これは、当時進行中である可能性のある非原子的作業にとって常に危険です。 。

答え2

まず、中断コマンド待機15(中断がない場合)kill 2などを実行する必要があります。

一般的に言えば、プログラムが15、2、1を終了しても例外を除いて正常に実行されていても終了しない限り、これは最善のシグナルではありません。すぐに終わると期待できないけど。

第二に、終了したい特定のプログラムによって異なります。一部のプログラムはキャプチャしてクリーンアップし、一部はキャプチャしてクリーンアップする必要がありますが、いくつかはクリーンアップするものではなく、オペレーティングシステムでクリーンアップすることができます。など。

また、(常に)アプリケーションに送信できる他の信号があることを確認する必要があります。またはデーモンの場合、通常は起動/停止スクリプトなどがあります。

また見なさい:

関連情報