これは私が起こらなければならないことです:
待機を発生させるにはどうすればよいですか?
「スリープ」がすべてを停止しているように見え、プロセスAが完全に完了するのを「待機」したくないのです。時間ベースのループをいくつか見てきましたが、もっときれいなものがあるかどうか疑問に思っています。
私があなたの質問を誤解していない限り、それはこの短いスクリプトで簡単に達成できます:
#!/bin/bash
process_a &
sleep x
process_b
(スクリプトがprocess_a
の終了を待ってから終了する場合は、最後にwait
を追加してください)。
(@BaardKopperudによって提案されているように)スクリプトを必要とせずに、これをワンライナーとして行うこともできます。
process_a & sleep x ; process_b
バックグラウンド制御演算子(&) を使用してプロセスをバックグラウンドで実行し、 sleep
command を使用して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
...
...
...
私は@ 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ループです。