使linux“等待”命令等待所有子进程

时间:2010-02-18 16:20:44

标签: linux bash wait

等待不等待所有子进程停止。这是我的剧本:

#!/bin/bash

titlename=`echo "$@"|sed 's/\..\{3\}$//'`
screen -X title "$titlename"

/usr/lib/process.bash -verbose $@

wait

bash -c "mail.bash $@"
screen -X title "$titlename.Done"

我无法访问 /usr/lib/process.bash ,但它是一个经常更改的脚本,因此我想引用它...但在该脚本中:

#!/bin/ksh
#lots of random stuff
/usr/lib/runall $path $auto $params > /dev/null 2>&1&

我的问题是 runall 会创建一个日志文件......而 mail.bash 就是要将该日志文件邮寄给我,但等待不等待 runall 完成后,似乎只是等待 process.bash 完成。无论如何,无法访问 process.bash ,或者尝试保留我自己的 process.bash 最新版本,以使等待正确等待 runall 完成? (日志文件会覆盖以前的运行,所以我不能只检查是否存在日志文件,因为总有一个日志文件存在)

谢谢, 丹

4 个答案:

答案 0 :(得分:8)

(
    . /usr/lib/process.bash -verbose $@
    wait
)

不是让操作系统启动process.bash,而是创建一个子shell,运行process.bash中的所有命令,就像它们被输入我们的shell脚本一样,并在该子shell中等待。

对此有一些警告,但如果你没有做任何不寻常的事情,它应该有用。

答案 1 :(得分:4)

wait只等待直接的孩子;如果有孩子产生自己的孩子,就不会等他们。

答案 2 :(得分:2)

主要问题是,由于process.bash退出,runall进程将被孤立并由init拥有(PID 1)。如果您查看进程列表,runall将不再与您的进程建立任何可见的连接,因为退出了中间process.bash脚本。一旦它成为孤儿,就无法使用ps --ppid或类似的东西来搜索这个“孙子”进程。

您可以wait查询特定的PID。你知道runall进程的PID吗?如果只有一个这样的过程你可以尝试这个,它将等待所有正在运行的runall

wait `pidof runall`

答案 3 :(得分:1)

您可以恢复您想要等待的进程的PID

然后将此PID作为参数传递给命令Wait