バックグラウンドでコマンドを複数回実行する(bashスクリプト)

バックグラウンドでコマンドを複数回実行する(bashスクリプト)

私は3つのコマンドを実行する必要があるbashスクリプトを書いています。

  • コマンドは1バックグラウンドで10秒ごとに実行する必要があります。
  • コマンドは2バックグラウンド3でも一度実行する必要があります。
  • また、コマンドは1正常に機能するために必要な最後の2つのファイルを作成/更新するため、コマンドと実行の前に少なくとも1回は正常に実行する必要があります。23

しかし、これらの条件でコマンドを実行する方法がわかりません... aまたは同様のものと一緒に1aを使用することはできません。なぜなら、コマンドに到達できないからです sum 。while(1)sleep 1023

私が見逃しているbashスクリプトの概念は何ですか?たぶんスレッド?

編集する:コマンドは、コマンドと.txtで使用される1.txtファイルの整数を増やすのと同じくらい簡単です。23

ベストアンサー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機能に移動し、このコードをきれいに整理することができます。

おすすめ記事