5

kill は同期コマンドではないことを最近知ったので、bash でこの while ループを使用しています。

while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done

ただし、場合によっては (非常にまれですが、それでも発生します)、プロセスがスタックし、kill シグナルに反応しない場合があります。このような場合、アプリを強制終了する唯一の方法は「kill -9」を使用することです。

それで、ループが10回目の繰り返しに達した場合にのみ、-9引数を使用するように、bashで上記のwhileループをどのように変更しますか?

4

4 に答える 4

2

他のユーザーが言ったように....この残忍な方法を使用する前に、ブロックの原因を修正する必要があります...とにかく...これを試してください

#!/bin/bash

i=0

PID_OF_THE_PROCESS="your pid you can set as you like"

# send it just once
kill $PID_OF_THE_PROCESS 2>/dev/null;

while [ $i -lt 10 ];
do
    # still alive?
    [ -d /proc/$PID_OF_THE_PROCESS ] || exit;
    sleep 1;
    i=$((i+1))
done

# 10 iteration loop and still alive? be brutal
kill -9 $PID_OF_THE_PROCESS
于 2013-02-25T12:58:20.783 に答える
1

シグナルは 1 回送信するだけで十分です。

kill $PID 2>/dev/null
sleep 10;
if kill -0 $PID 2>/dev/null
  kill -9 $PID
fi

カウンターの質問について:

c=0
while true; do
    echo $c;
    c=$((c+1));
    if [ $c -eq 10 ]; then break; fi;
done
于 2013-02-25T12:49:48.547 に答える
1

確かに、カウンターを使用しますが、それは少し不器用です。

おそらく本当にやりたいことは0、シグナルとして使用することです。これは、プロセスには何もしませんが、プロセスがまだ生きているかどうかを確認できます。(kill -0 $pidプロセスが存在しない場合は、ゼロ以外の終了ステータスを返します。) そして、それだけkill -9ではありません。プロセスが理由なくスタックすることはありません。ネットワークやファイルシステムのブロックが発生した場合など、リソースを解放できないためにプロセスがスタックします。ブロックを解決すると、プロセスはその後クリーンアップできます。

于 2013-02-25T12:45:57.087 に答える
0

これを実現するにはいくつかの方法がありますが、既存のループを変更するように依頼した場合は、次のようになります。

count=0
while kill PID_OF_THE_PROCESS 2>/dev/null
do 
    sleep 1; 
    (( count++ ))
    if (( count > 9 ))
    then
        kill -9 PID_OF_THE_PROCESS 2>/dev/null
     fi
done
于 2013-02-25T13:03:24.713 に答える