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

睡眠 0 [1]- 完成睡眠 ${i} && echo -en "\nsleep ${i} "
user@host:~$
sleep 2 [2]+ 完成睡眠 ${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

睡眠 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(假设它是一个 shell 脚本)可以在终止前立即打印出一条状态消息和它自己的 $1。

于 2009-09-02T20:06:58.850 回答