3

バックグラウンドジョブとしてループで割り当てられたさまざまなパラメーターを使用して、時間のかかる実行可能ファイルを並行して実行しています。おもちゃの例とその出力は次のとおりです。

bash-3.2$ set -o notify
bash-3.2$ for (( i=0 ; i < 4 ; i+=2 )); do
>    sleep ${i} &
> done
[1] 32394
[2] 32395
bash-3.2$ [1]-  Done                    sleep ${i}
[2]+  Done                    sleep ${i}

各ジョブの実行が終了すると、通知されることに注意してください。最後のメッセージには、ジョブのコマンドが表示されますが、パラメーターが展開されていないため、メッセージを見て、使用しているパラメーター値を明確に判断する方法はありません。メッセージがどんなものか

bash-3.2$ [1]-  Done                    sleep 0
[2]+  Done                    sleep 2

そうすることは可能ですか?

ありがとう、よろしく!

4

2 に答える 2

1

あまりきれいではない:

for (( i=0 ; i < 4 ; i+=2 )); do
    sleep ${i} && echo  -en "\nsleep ${i} "&
done

出力は次のようになります。

[1] 29311
[2] 29313

sleep 0 [1]- Done sleep ${i} && echo -en "\nsleep ${i} "
user@host:~$
sleep 2 [2]+ Done sleep ${i} && echo -en "\nsleep $ {私} "

関数はそれを少しきれいにすることができます:

myeval () {
    eval "$*" && echo -en "\n$* "
}

次に、次のことができます。

for (( i=0 ; i < 4 ; i+=2 )); do
    myeval "sleep ${i}"&
done

出力は次のようになります。

[1] 29635
[2] 29636

sleep 0 [1]- myeval "sleep ${i}" 完了
user@host:~$
sleep 2 [2]+ myeval "sleep ${i}" 完了

于 2009-09-02T19:48:55.250 に答える
0

最後のものが完了するまで待ちたい場合は..

for ((i=0; i < 4; i+=2 )); do
    long_running_process $i &
done

wait

各 long_running_process (シェル スクリプトと仮定) は、終了直前にステータス メッセージと独自の $1 を出力できます。

于 2009-09-02T20:06:58.850 に答える