等待不等待

等待不等待

如果我有一个名为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 &; waitwait命令导致交互式 shell(sh显式调用的父 shell)一直挂起,直到sh退出。

答案2

在这个特定的示例中,最好只wait在主 shell 中运行,如 Bruce 的答案所示,但如果您有一些无法执行此操作的替代情况 - 例如,如果您需要myprogram作为前台进程运行,或者如果它是没有控制终端的守护进程 - 你可以使用我编写的程序等待这将等待任意进程完成。要在本例中使用它,运行后

$ sh myprogram

您将以某种方式获得进程 ID myprogram,然后在 中notify,而不是wait使用

pwait PID

pwait目前我的版本是仅限 Linux 的。如果你运行的是 FreeBSD,他们有他们自己的实现它似乎可以作为标准实用程序使用。您还可以使用它ps来反复检查命令是否已完成,如下所示这个 shell 脚本(尽管这并没有告诉您命令的退出代码,以防相关)。

相关内容