3

killall時々 、特定のプロセスを実行したいのですが、実行killallできません。そのため、プロセスを再度開始しようとすると、前のセッションがまだ実行されているため失敗します。それから私は退屈killall -9にそれを実行する必要があります。そこで、生活を簡素化するために、realkillスクリプトを作成しました。スクリプトは次のようになります。

PIDS=$(ps aux | grep -i "$@" | awk '{ print $2 }') # Get matching pid's.
kill $PIDS 2> /dev/null # Try to kill all pid's.
sleep 3
kill -9 $PIDS 2> /dev/null # Force quit any remaining pid's.

それで、これはこれを行うための最良の方法ですか?このスクリプトをどのように改善できますか?

4

3 に答える 3

5

killallすべての UNIX プラットフォームで一貫した実装がないため、できる限り避けてください。Proctools' pkillおよびpgrepが推奨されます。

for procname; do
    pkill "$procname"
done

sleep 3
for procname; do
    # Why check if the process exists if you're just going to `SIGKILL` it?
    pkill -9 "$procname"
done

(編集) 強制終了された後に再起動するはずのプロセスがある場合、それらを盲目的に強制終了したくない場合があるため、最初に PID を収集できます。

pids=()
for procname; do
    pids+=($(pgrep "$procname"))
done
# then proceed with `kill`

SIGKILLとはいえ、できれば使用を避けるようにしてください。ソフトウェアがそれ自体をクリーンアップする機会はありません。を受け取った直後にプログラムが終了しない場合はSIGTERM、何かを待っている可能性があります。何を待っているのか (ハードウェア割り込み? ファイルを開く?) を見つけて修正し、きれいに閉じることができます。

于 2012-08-09T18:13:38.917 に答える
2

プロセスが正確に何をするのかを理解していないと、おそらく理想的ではないと思います。なぜなら、あなたが殺しているプロセスが実際に有用なシャットダウン/クリーンアップ作業を行っているという状況があるかもしれないからです。強制的にダウンさkill -9せると、その作業が短絡し、プロセスが実際にデータを書き込んでいる場合に破損が発生する可能性があります。

データ破損の危険がなく、シャットダウンを短絡しても問題ないと仮定するとkill -9、最初のプロセスだけで完了できますか。シャットダウンの発生を妨げる可能性のある何が起こっているのかを理解するために、強制終了しているプロセスの開発者にアクセスできますか? 正当な理由により、プロセスが INT および TERM をブロックした可能性があります。

于 2012-08-09T18:16:33.850 に答える
2

可能性は低いですが、その 3 秒間の待機中に、新しいプロセスがその PID を引き継いで、2 回目の kill でそのプロセスが強制終了される可能性があります。

于 2012-08-09T19:05:28.653 に答える