2010-11-09 65 views
3

這就是問題所在。另外,我所擁有的僅僅是PID,而我運行命令的shell不一定是最初調用該進程的shell。有任何想法嗎?是否有Linux命令阻塞,直到進程退出?

+0

我知道這是不是猶太問了這樣一個問題的問題更清潔,但是......你怎麼知道進程的PID是尚未創建? PID可以是相當隨機的。當然,在實踐中,它們是線性分配的,但您不知道在時間「A」和「B」之間將開始多少個進程,或者PID計數器是否會進行換行。 – 2010-11-10 00:01:21

+0

@TomMD也許他使用'pidof'來在運行時找到進程的PID,或者其他的東西。有一百種不同的方式可以擁有進程的PID,而不是在shell腳本中對其進行硬編碼;) – MartinodF 2010-11-10 00:27:46

+0

@TomMD我知道PID,因爲我知道進程名稱,並且我可以使用ps命令來獲取PID。 – 2010-11-10 11:59:03

回答

2
while ps -p $PID >/dev/null 2>&1; do sleep 1; done 

while ps -p $PID >/dev/null 2>&1; do :; done 
+0

這是我見過的最好的答案。我想知道爲什麼bash的內置版本的等待只在當前shell的子進程中才起作用。 – 2010-11-10 12:39:09

+0

@B約翰遜:因爲它需要一個只在當前shell中有效的作業ID,而不是採用PID。在工作控制的工作方式內部可能還有其他一些原因。 – 2010-11-10 15:32:53

2

這不是一個很乾淨的方法,但你可以連續發出kill(2)系統調用指定的pid,將0作爲一個信號。通過將errno設置爲ESRCH,第一次kill不成功,則可以斷定該過程已退出。

+1

比如'0'。 – 2010-11-09 21:55:11

+0

kill -0 $ {PID}是首選方式。由於它只使用一個簡單的系統調用,因此它具有便攜性和快速性。 – Metiu 2010-11-10 17:15:14

1

您可以檢查dir/proc/PID是否存在。這似乎不是發送多個信號

相關問題