一部のプロセスを終了する必要がある自動化スクリプトを作成しています。
以前は主にプロセスを終了しましたが、一度はいくつかのプロセスを終了したkill -9 pid
ときに次のような事実を見つけました。kill -9
tcpdump
たとえば、
tcpdump -i eth0 -w output.pcap
キャッチバッグは入れずにoutput.pcap
空いていた。しかし、使用するとkill
素晴らしい動作します。
たとえば、一部のプロセスでは、killプロセスを./prog >> test_log
使用するとkill -9
出力がリダイレクトされませんtest_log
。
kill
また、killコマンドを使用しないと使用に-9
失敗する可能性があるという心配もあります。
kill
殺すことは、出力ファイルに問題を引き起こすことなく、問題なくプロセスを殺すために正しく使用する方法を教えてくれますか?
答え1
プロセスが端末に書き込まずにリダイレクトを使用している場合(または明示的にファイルに書き込む場合でも)、バッファリングが問題になる可能性があります。stdbuf
とunbuffer
()を確認するexpect
か、ここで検索してください。
このフラグを使用すると、問題tcpdump
を解決または減らすことができます-U
。
一般的に言えば、次のように殺す必要があります。
kill $PID; sleep $wait; kill -9 $pid &>/dev/null
kill
/は、メモリとプロセスのリストからプロセスを削除するkill -TERM
のではなく、プロセスをきちんと完了する機会を提供します(たとえば、バッファフラッシュやファイルディスクリプタを閉じるなど)kill -KILL
。これは、当時進行中である可能性のある非原子的作業にとって常に危険です。 。
答え2
まず、中断コマンド待機15
(中断がない場合)kill 2
などを実行する必要があります。
一般的に言えば、プログラムが15、2、1を終了しても例外を除いて正常に実行されていても終了しない限り、これは最善のシグナルではありません。すぐに終わると期待できないけど。
第二に、終了したい特定のプログラムによって異なります。一部のプログラムはキャプチャしてクリーンアップし、一部はキャプチャしてクリーンアップする必要がありますが、いくつかはクリーンアップするものではなく、オペレーティングシステムでクリーンアップすることができます。など。
また、(常に)アプリケーションに送信できる他の信号があることを確認する必要があります。またはデーモンの場合、通常は起動/停止スクリプトなどがあります。
また見なさい: