シェルスクリプトで(1)バックグラウンドでコマンドを起動するには(2)x秒待ちます(3)そのコマンドの実行中に2番目のコマンドを実行するにはどうすればよいですか?

シェルスクリプトで(1)バックグラウンドでコマンドを起動するには(2)x秒待ちます(3)そのコマンドの実行中に2番目のコマンドを実行するにはどうすればよいですか?

これが私が起こらなければならないことです:

  1. バックグラウンドでプロセスAを開始
  2. x秒だけ待って
  3. フォアグラウンドでプロセスBを開始

どうすれば待つことができますか?

私は「スリープ」がすべてを停止するように見えますが、実際にプロセスAが完全に完了するまで「待機」したくありません。時間ベースのループを見たことがありますが、よりきれいなものがあるかどうか疑問に思います。

答え1

あなたの質問を誤解していない場合は、次の短いスクリプトを使用して簡単に解決できます。

#!/bin/bash

process_a &
sleep x
process_b

waitスクリプトが終了する前に完了するのを待つようにするには、process_a最後に追加のエントリを追加します)。

スクリプトなしで1行のコードで実行することもできます(@BaardKopperudが提案したように)。

process_a & sleep x ; process_b

答え2

あなたはそれを使用することができますバックグラウンド制御演算子(&)バックグラウンドでプロセスを実行するsleep注文する2番目のプロセスを実行する前に待ってください。例:

#!/usr/bin/env bash
# script.sh

command1 &
sleep x
command2

以下は、タイムスタンプが表示されたいくつかのメッセージを印刷する2つのコマンドの例です。

#!/usr/bin/env bash

# Execute a process in the background
echo "$(date) - Running first process in the background..."
for i in {1..1000}; do
    echo "$(date) - I am running in the background";
    sleep 1;
done &> background-process-output.txt &

# Wait for 5 seconds
echo "$(date) - Sleeping..."
sleep 5 

# Execute a second process in the foreground
echo "$(date) - Running second process in the foreground..."
for i in {1..1000}; do
    echo "$(date) - I am running in the foreground";
    sleep 1;
done

これを実行して、目的の動作が表示されることを確認します。

user@host:~$ bash script.sh

Fri Dec  1 13:41:10 CST 2017 - Running first process in the background...
Fri Dec  1 13:41:10 CST 2017 - Sleeping...
Fri Dec  1 13:41:15 CST 2017 - Running second process in the foreground...
Fri Dec  1 13:41:15 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:16 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:17 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:18 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:19 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:20 CST 2017 - I am running in the foreground
...
...
...

答え3

@dr01の答えが好きですが、彼は終了コードを確認していないので、成功したかどうかはわかりません。

終了コードを確認するソリューションは次のとおりです。

#!/bin/bash

# run processes
process_a &
PID1=$!
sleep x
process_b &
PID2=$!
exitcode=0

# check the exitcode for process A
wait $PID1    
if (($? != 0)); then
    echo "ERROR: process_a exited with non-zero exitcode" >&2
    exitcode=$((exitcode+1))
fi

# check the exitcode for process B
wait $PID2
if (($? != 0)); then
    echo "ERROR: process_b exited with non-zero exitcode" >&2
    exitcode=$((exitcode+1))
fi
exit ${exitcode}

通常、PIDをbash配列に保存し、pidチェックはforループです。

関連情報