2011-03-05 48 views
16

我想暂停执行BASH脚本,直到进程关闭(我将PID存储在变量中)。我在想
while [ PID IS RUNNING]; do
sleep 500
done
BASH - 检查PID是否存在

我看过的大多数例子都使用/ dev/null,这似乎需要root权限。有没有办法做到这一点,而不需要根?

非常感谢您提前!如果$pid运行

+3

退房http://stackoverflow.com/questions/356100/how-to-wait-in-bash-for-several-subprocesses- to-finish-and-return-exit-code-0-w – atk 2011-03-05 21:55:28

+1

请看[Process Management](http://mywiki.wooledge.org/ProcessManagement)。你能举一个使用'/ dev/null'的例子,它需要root吗?我无法想象这将是怎样的情况,或者它将如何适用于这种情况。 – 2011-03-05 22:01:20

+0

/dev/null的哪些用法似乎需要root?想不出任何。 – ndemou 2015-10-27 11:05:20

回答

31

kill -s 0 $pid将返回成功,否则失败,而无需实际发送信号的过程,这样你就可以直接使用,在你的if声明。

wait $pid将等待该过程,取代您的整个循环。

+1

谢谢。这是我现在的代码:'while sleep 1;杀死-0 $ PIDD ||打破; done'。 – JohnP 2011-03-06 01:43:50

+9

注意:'kill -0 $ pid'只适用于您拥有的进程。 'ps -p $ pid'适用于任何进程。 – sligocki 2012-05-08 19:18:31

+2

注意:'wait $ pid'只在你是'$ pid'的父项时才起作用。 – Harish 2012-09-06 00:29:56

7

您可能会看到/proc/YOUR_PID目录的存在。

+2

没关系,如果您只在Linux中运行脚本。为了保证兼容性,最好使用上面给出的'kill -s'技巧。 – Zouppen 2012-04-19 13:06:05

+0

在我的测试中,我发现该目录在进程终止后暂时停留 – Bryan 2014-09-18 10:27:49

3

我总是使用以下 tail -f /dev/null --pid $PID。它不需要显式循环,并且不仅限于你的shell的子pid。

+0

FreeBSD和OSX上的'tail'命令不包含'--pid'选项。如果OP不询问特定的操作系统,则应该限定您提供的平台特定答案。 – ghoti 2015-07-30 04:03:37

16

好像你要

wait $pid 

将返回时$pid结束。

否则,你可以使用

ps -p $pid 

检查过程是否还活着(这比kill -0 $pid更有效,因为它会工作,即使你没有自己的PID)。

1

ps --pid $pid &>/dev/null

返回0,如果它存在,否则为1点

+0

'ps'的'--pid'选项可能在你的操作系统中工作,但它在我的工作中不起作用。 OP是否提到了他正在运行的操作系统?如果没有,您应该限定您提供的特定于操作系统的和不可移植的答案。 – ghoti 2015-07-30 04:01:37

+0

够公平的。 '--pid'适用于Ubuntu 12.04。 – 2015-07-30 04:08:18