0

次のスクリプトを使用して、タイムアウトでプロセスを強制終了します。

# $1 - name of program and its command line

#launch program and remember PID
eval "$1" &
PID=$!

echo "Program '"$1"' started, PID="$PID

i=1
while [ $i -le 300 ]
do
 ps -p $PID >> /dev/null
 if [ $? -ne 0 ]
  then
   wait $PID
   exit $? #success, return rc of program
  fi

 i=$(($i+1))
 echo "waiting 1 second..."
 sleep 1
done

#program does not want to exit itself, kill it
echo "killing program..."
kill $PID
exit 1 #failed

これまでのところ、うまく機能していますが、今日、htop で「ハングしている」プロセスの束に気づいたので、チェックアウトしたところ$PID、この場合はプログラム プロセスの ID ではなく、スクリプト自体、および私がチェックしたすべての時間、プログラムの ID は$PID+1. さて、問題は、それは常にそうであり、次のようなもの$PID+1に置き換えることによって重要なものを殺すことはないと仮定するのは正しいですかkill $PIDkill $PID $($PID+1)

編集:次$1のようないくつかの議論があるかもしれません./bzip2 -ds sample3.bz2 -k

4

5 に答える 5

3

次の変更で簡単に問題を解決できます。

から:

eval "$1" &

に:

eval "$1 &"

理由はこの回答で説明されています。

于 2013-08-23T12:38:42.723 に答える
2

この機能を備えたスクリプトを書き始めました。「タイムアウト」と呼ぶつもりでしたが、空のファイルを開く前に、同じ名前のコマンドが既にあるかどうかを確認しました。ありました...

タイムアウト

編集

失敗時の戻り値として具体的に「1」が必要な場合...

timeout 1 nano -w; `if [[ $? == 124 ]] ; then exit 1 ; fi ; exit $?`
于 2013-08-23T12:17:30.317 に答える
1

プレーンの何が問題なのですか

( eval "$1" ) &
sleep 300
kill %1
于 2013-08-23T11:27:29.383 に答える