3つのコマンドを実行する必要があるbashスクリプトを書いています。
1
は、バックグラウンドで10秒ごとに実行する必要があります2
と3
は、バックグラウンドで1回実行する必要があります。1
は、最後の2つが適切に機能するために必要なファイルを生成/更新するため、コマンド2
を3
実行する前に、少なくとも1回は正常に実行する必要があります。ただし、1
これらの条件でコマンドを実行する方法がわかりません...コマンドとに到達できないためwhile(1)
、sleep 10
またはそのようなものを使用することはできません。2
3
どのbashスクリプトの概念が欠けていますか?スレッド、多分?
編集:コマンド1
は、.txtファイル内の整数をインクリメントするような単純なものにすることができ、このファイルはコマンド2
と3
。で使用されます。
どのbashスクリプトの概念が欠けていますか?スレッド、多分?
ジョブ制御。プロセスをバックグラウンドで開始し、プロセスIDと終了ステータスを知ることで、プロセスをかなりきめ細かく制御できます。
バックグラウンドコマンドのPIDを取得するには、$!
変数を使用します。
バックグラウンドコマンドの終了ステータスを取得するwait()
には、そのPIDを使用して提供します。コマンドがまだ終了していない場合、への呼び出しwait()
はブロックされることに注意してください。このブロッキングが問題である場合(あなたの場合)、ps
呼び出す前に(または他の方法で)チェックを実行してwait()
、プロセスが刈り取られる準備ができているかどうかを確認できます。タスクの実行時間に制限を設定する方法。
次のサイクルベースのボイラープレートを検討してください。
complete=0
cycles=0
# Task 1
sleep 200 &
pid=$!
while [[ complete -eq 0 ]]; then
ps -o pid= -p $pid > /dev/null
if [[ $? -ne 0 ]]; then
# Signal complete to logic below
complete=1
break;
fi
# Perform some timeout / cycle check to give up on this task
cycles=$((cycles + 1))
if [[ $cycles -gt 100 ]]; then # whatever, this is just a simple watchdog example
break;
fi
# Optional sleep
sleep 1
done
if [[ $complete -eq 1 ]]; then
# Process the command's exit status
wait $pid
if [[ $? -ne 0 ]]; then
: # handle command failed perhaps
else
: # do other things, assuming exit of 0 is a good thing
fi
else
# Process a command watchdog failure
kill -9 $pid # come what may
fi
より複雑なジョブ制御の場合は、コマンドチェックとサイクル管理をbash関数に移動して、このコードを大幅にクリーンアップできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加