web-dev-qa-db-ja.com

バックグラウンドジョブが生きているかどうかを確認するにはどうすればよいですか? (bash)

次の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も同時に開始します。そうでなければ、私はただやめたいだけです。

ただし、最初のジョブが有効であるかどうかを確認する方法がわからないため、疑似コードの行です。それで、その場所に何を置くべきですか?

14

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

sleep 30 &
if ps -p $! >&-; then
    wait $!
else
    jobs
fi
13
Todd A. Jacobs

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

./script2 &
myPid=$!
sleep 5

if kill -0 "$myPid"; then
    script3 &
    wait
fi
10
ormaaj

Fduffの答えを拡張するには、jobsビルトインを使用できます。

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

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

6
Gerald Combs

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

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

if kill -0 $pid1; then
  ./script3.sh&
  pid3=$!
  wait
fi
5
bobah

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

0
fduff