等待不等待所有子进程停止。这是我的剧本:
#!/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 完成? (日志文件会覆盖以前的运行,所以我不能只检查是否存在日志文件,因为总有一个日志文件存在)
谢谢, 丹
答案 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