我已經定制了我的作業,以便其中 4 個作業在一個 4-vcpu 實體上很好地作業,并且有一個 bash 腳本為每個作業啟動 4 個行程:
for pidx in {0..3}; do
prname=$1"-"$pidx
echo "start java" `date` $prname
{ (java -server -Xmx4g -jar $JARPATH "$prname" $DATADIR) } &
sleep 10; echo "end sleep" $prname `date`
done
現在我希望能夠將幾個這樣的作業排隊,等待所有四個行程完成,然后再啟動下一組 4 個。這是一個嘗試:
TSTJOBS="job1 job2"
for JNAME in $TSTJOBS; do
echo "startloop " $(date %T) $JNAME $$
for pidx in {0..3}; do
(
prname=$JNAME"-"$pidx
echo "start java" $prname $(date %T) $!
(java -server -Xmx4g -jar $JARPATH "$prname" $DATADIR) &
pid=$!
sleep 10; echo "end java " $prname $(date %T) $pid
)
wait $pid
done
echo "eoloop " $(date %T) $JNAME
done
我已經嘗試了幾個地方來獲取 processID 和wait命令,但是:
- 在繼續之前,我等待 *所有 8 個子作業終止,
- 所有作業同時運行,或
- 我得到“pid XXX 不是這個 shell 的孩子”錯誤?
我應該將等待陳述句放在這些嵌套回圈中的什么位置?
uj5u.com熱心網友回復:
考慮添加一個函式來處理個人作業細節,例如:
run_job() {
prname="$1-$2"
echo "start java $prname $(date %T)"
java -server -Xmx4g -jar "$JARPATH" "$prname" "$DATADIR"
echo "end java $prname $(date %T)"
}
現在主腳本變為:
TSTJOBS="job1 job2"
for JNAME in $TSTJOBS; do
echo "startloop $(date %T) $JNAME"
for pidx in {0..3}; do
run_job "${JNAME}" "${pidx}" & # place function call in background; NOTE: all function output will print to console so you'll get a mix of 4x sets of output spewed to the console
done
wait # wait for all 4x function calls to complete before running next iteration of outer loop
echo "eoloop $(date %T) $JNAME"
done
如果由于某種原因您不能(或不想)使用該功能,您可以行內完成相同的事情,例如:
for JNAME in $TSTJOBS; do
echo "startloop $(date %T) $JNAME"
for pidx in {0..3}; do
{ prname="$1-$2"
echo "start java $prname $(date %T)"
java -server -Xmx4g -jar "$JARPATH" "$prname" "$DATADIR"
echo "end java $prname $(date %T)"
} &
done
wait
echo "eoloop $(date %T) $JNAME"
done
或者因為您真的只需要將結束echo呼叫與相關java呼叫匹配,混合也足夠了,例如:
for JNAME in $TSTJOBS; do
echo "startloop $(date %T) $JNAME"
for pidx in {0..3}; do
prname="$1-$2"
echo "start java $prname $(date %T)"
{ java -server -Xmx4g -jar "$JARPATH" "$prname" "$DATADIR"
echo "end java $prname $(date %T)"
} &
done
wait
echo "eoloop $(date %T) $JNAME"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517585.html
標籤:重击for循环等待
上一篇:當我管道輸出時究竟會發生什么?
