2009-09-02 47 views
3

我正在運行一些耗時的可執行文件,並將循環中分配的不同參數作爲並行的後臺作業運行。這裏有一個玩具的例子和它的輸出:通知後臺作業完成在bash中運行

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 

是否可以這樣做?

感謝和問候!

回答

1

不是很漂亮:

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

輸出的樣子:

[1] 29311
[2] 29313

睡眠0 [1] - 完成睡眠$ {i} & & echo -en「\ nsleep $ {i}」
user @主機:〜$
睡眠2 [2] +完成睡眠$ {I} & &回波烯 「\ nsleep $ {I}」

函數可以neaten它一點:

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

然後,你可以這樣做:

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

和輸出的樣子:

[1] 29635
[2] 29636

睡眠0 [1] - 完成myeval 「睡眠$ {I}」
用戶@主機:〜$
睡眠2 [2] +完成myeval 「睡眠$ {I}」

0

如果你想等到最後一個完成..

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

wait 

每long_running_process(假設它是一個shell腳本)可以在終止之前立即打印出狀態消息和它自己的$ 1。

+0

但是,他沒有得到'set -o notify'給他的即時反饋。 – 2009-09-02 20:28:16