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

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

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

以前は主にプロセスを終了しましたが、一度はいくつかのプロセスを終了した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。これは、当時進行中である可能性のある非原子的作業にとって常に危険です。 。

おすすめ記事