16

次のbashスクリプトがあります。それを呼び出すことができますscript1.sh

#!/bin/bash

exec ./script2.sh &

sleep 5

if job1 is alive then #<--- this line is pseudo-code!
    exec ./script3.sh &
    wait
fi

ご覧のとおり、スクリプトはscript2.shバックグラウンド ジョブとして実行され、その後 5 秒間待機します (これscript2.shにより、いくつかの初期化処理が実行されます)。初期化が成功した場合、script2.shジョブはまだ有効です。この場合、私もscript3.sh同時に開始したいと考えています。そうでなければ、やめたいだけです。

ただし、最初のジョブが生きているかどうかを確認する方法がわからないため、疑似コードの行。それで、代わりに何を入れるべきですか?

4

6 に答える 6

15

で最新のバックグラウンド ジョブの PID を取得できます$!その後、 psの終了ステータスをチェックして、その特定の PID がまだプロセス リストにあるかどうかを判断できます。例えば:

sleep 30 &
if ps -p $! >&-; then
    wait $!
else
    jobs
fi
于 2012-06-28T07:06:53.620 に答える
12

シグナルが配信可能かどうかを確認できます

./script2 &
myPid=$!
sleep 5

if kill -0 "$myPid"; then
    script3 &
    wait
fi
于 2012-06-28T07:05:00.293 に答える
9

fduffの答えを拡張するには、jobs組み込みの機能を使用できます。

if jobs %%; then
    exec ./script3.sh &
    wait
fi

jobs %%最新のバックグラウンドプロセス(「現在のジョブ」)のジョブIDを出力し、成功した場合は0を返し、そのようなジョブがない場合は1を返します。

于 2012-11-30T17:25:39.663 に答える
5

親プロセスのイメージが子プロセスのイメージに置き換えられるため、execがバックグラウンドで機能するかどうかはわかりません。そうでない場合、execを削除すると仮定すると、次のようになります。

#!/bin/bash
./script2.sh&
pid1=$!

if kill -0 $pid1; then
  ./script3.sh&
  pid3=$!
  wait
fi
于 2012-06-28T07:03:31.890 に答える
0

jobsコマンドを見てください。実行中のすべてのジョブが一覧表示されます。

于 2012-06-28T07:06:45.263 に答える