次の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
も同時に開始します。そうでなければ、私はただやめたいだけです。
ただし、最初のジョブが有効であるかどうかを確認する方法がわからないため、疑似コードの行です。それで、その場所に何を置くべきですか?
$!
を使用して、最新のバックグラウンドジョブのPIDを取得できます。次に、psの終了ステータスをチェックして、その特定のPIDがまだプロセスリストにあるかどうかを判断できます。例えば:
sleep 30 &
if ps -p $! >&-; then
wait $!
else
jobs
fi
シグナルが配信可能かどうかを確認できます
./script2 &
myPid=$!
sleep 5
if kill -0 "$myPid"; then
script3 &
wait
fi
Fduffの答えを拡張するには、jobs
ビルトインを使用できます。
if jobs %%
exec ./script3.sh &
wait
fi
jobs %%
は、最新のバックグラウンドプロセス(「現在のジョブ」)のジョブIDを出力し、成功した場合は0を返し、そのようなジョブがない場合は1を返します。
親プロセスのイメージが子プロセスのイメージに置き換えられるため、execがバックグラウンドで機能するかどうかはわかりません。そうでない場合、execを削除すると仮定すると、次のようなものが必要になります。
#!/bin/bash
./script2.sh&
pid1=$!
if kill -0 $pid1; then
./script3.sh&
pid3=$!
wait
fi
jobs
コマンドを見てください。実行中のすべてのジョブが一覧表示されます。