bashrcに次の関数を書いた。 5秒ごとにジョブが実行されていることを確認し、ジョブが完了したら電子メールを送信します。
function jobcheck () {
time=`date`
jobstatus=`jobs $1`
while [ 1 ]; do
if (( ! `echo $jobstatus | grep "Running" | wc -l` )); then
"sendEmail command to send email"
break;
fi
sleep 5;
done
}
この関数を次のように呼び出したい(たとえば、タスク番号2の場合)。
jobcheck 2
コマンドラインから他のコマンドを実行し続けます。ただし、whileループは引き続き実行され、コマンドプロンプトは表示されません。
実行すると
jobcheck 2 &
その後、エラーが発生します。bash: jobs 2 not found
この機能はバックグラウンドでどのように実行できますか?
ベストアンサー1
これを行うには、関数を再構築する必要があります。
を使用してバックグラウンドタスクを開始すると、&
シェルはタスクを追跡し、組み込みjobs
機能を使用して実際により多くの情報を見つけることができます。しかし、この情報は特定ですそのインスタンスshell;関数を直接実行すると、&
バックグラウンドジョブを含むシェルではなく別々のシェルが作成されるため、その別のシェルから元のシェルジョブに関する情報にアクセスできなくなります。
ただし、この問題を解決する簡単な方法があります。
- タスク番号の代わりにプロセスID(PID)に基づいて実行されるように関数を再構築してください。つまり、プロセスがまだ存在するかどうかを確認します(
ps
出力を解析するか、プロセスが/proc/pid
存在するかどうかを確認します)。 %2
代わりに引数で2
新しい関数を実行してください。つまり、監視するジョブIDの後にパーセント記号を指定します。 Bourne シェルはパーセント記号を使用して、ジョブ ID をそのジョブの pid に置き換えます。
これで動作します。