
私は3つのコマンドを実行する必要があるbashスクリプトを書いています。
- コマンドは
1
バックグラウンドで10秒ごとに実行する必要があります。 - コマンドは
2
バックグラウンド3
でも一度実行する必要があります。 - また、コマンドは
1
正常に機能するために必要な最後の2つのファイルを作成/更新するため、コマンドと実行の前に少なくとも1回は正常に実行する必要があります。2
3
しかし、これらの条件でコマンドを実行する方法がわかりません... aまたは同様のものと一緒に1
aを使用することはできません。なぜなら、コマンドに到達できないからです sum 。while(1)
sleep 10
2
3
私が見逃しているbashスクリプトの概念は何ですか?たぶんスレッド?
編集する:コマンドは、コマンドと.txtで使用される1
.txtファイルの整数を増やすのと同じくらい簡単です。2
3
答え1
私が見逃している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機能に移動し、このコードをきれいに整理することができます。