7

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

#!/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

4 回答 4

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

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

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

于 2010-02-18T17:26:53.260 回答
4

wait只等待直系子女;如果任何孩子产生自己的孩子,它不会等待他们。

于 2010-02-18T16:27:17.260 回答
2

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

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

wait `pidof runall`
于 2010-02-18T16:31:14.877 回答
1

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

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

于 2010-02-19T00:10:07.677 回答