如果我有一个名为myprogram
包含的文件
sleep 200
date
在后台运行此命令:
$ sh myprogram &
我想知道使用命令何时myprogram
完成wait
$ cat >notify
wait PID
echo "Program completed"
$ sh notify &
PID
是第三个命令给出的进程ID,我的问题是在最后一个命令之后立即在终端上打印消息“程序完成”,为什么wait不等待? ,我使用的是ubuntu 11.10
答案1
亲子关系被所有涉及的“&”破坏了。
内置函数显然是基于该wait(2)
系统调用wait
,它仅适用于调用 的进程的直接子 PID wait(2)
。
当您调用 时sh myprogram &
,您将sh
作为交互式 shell 的子级运行。
当您调用 时sh notify &
,它sh
是交互式 shell 的子级。
所以第二个sh
与第一个没有直接的父关系sh
,并且wait
不会起作用。
如果您调用其中任何一个,这甚至都不起作用sh myprogram &; sh notify;
,因为该wait
命令是由交互式 shell 的子级调用的。
对我有用的是:sh myprogram &; wait
该wait
命令导致交互式 shell(sh
显式调用的父 shell)一直挂起,直到sh
退出。
答案2
在这个特定的示例中,最好只wait
在主 shell 中运行,如 Bruce 的答案所示,但如果您有一些无法执行此操作的替代情况 - 例如,如果您需要myprogram
作为前台进程运行,或者如果它是没有控制终端的守护进程 - 你可以使用我编写的程序等待这将等待任意进程完成。要在本例中使用它,运行后
$ sh myprogram
您将以某种方式获得进程 ID myprogram
,然后在 中notify
,而不是wait
使用
pwait PID
pwait
目前我的版本是仅限 Linux 的。如果你运行的是 FreeBSD,他们有他们自己的实现它似乎可以作为标准实用程序使用。您还可以使用它ps
来反复检查命令是否已完成,如下所示这个 shell 脚本(尽管这并没有告诉您命令的退出代码,以防相关)。