通过bash运行后台工作通知

时间:2009-09-02 18:57:20

标签: bash background notify

我正在运行一些耗时的可执行文件,这些可执行文件在循环中作为后台作业并行分配了不同的参数。这是一个玩具示例及其输出:

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

有可能这样做吗?

谢谢和问候!

2 个答案:

答案 0 :(得分:1)

不太漂亮:

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

输出如下:

  

[1] 29311
  [2] 29313

     

睡眠0 [1] - 完成睡眠$ {i}&amp;&amp; echo -en“\ nsleep $ {i}”
  用户@主机:〜$
  睡2 [2] +完成睡眠$ {i}&amp;&amp; echo -en“\ nsleep $ {i}”

一个功能可以稍微提高一点:

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}”
  用户@主机:〜$
  睡2 [2] +完成myeval“sleep $ {i}”

答案 1 :(得分:0)

如果你想等到最后一个完成......

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

wait

每个long_running_process(假设它是一个shell脚本)可以在终止之前立即打印出状态消息及其自己的$ 1。