2008-11-20 21 views
7

從Perl腳本中殺死進程及其所有子進程的最佳方式是什麼?它應該至少在Linux和Solaris下運行,並且不需要安裝任何其他軟件包。我怎樣才能用Perl殺死整個進程樹?

我的猜測是通過解析/ proc中的文件或解析ps的輸出(在Linux和Solaris之間似乎都不可移植)來獲取所有進程及其父母的列表;然後殺死樹中的所有進程(這似乎容易出現競態條件)。

我可以忍受這種特殊情況下的競爭條件,但我該如何輕鬆獲得流程列表?

回答

9

如果你能殺死進程組住,你可以使用以下命令:

kill -$signum, $pgid; 

其中$signum是信號編號,並$pgid是進程組ID。然而,信號的數字不是很方便攜帶,在這種情況下,你可以(在某些平臺上;讀perlfunc進行說明)執行下列操作(發送SIGTERM爲例):

kill 'TERM', -$pgid; 
+0

哪些進程屬於進程組?我使用IPC :: Open3來啓動一個進程(在Solaris上運行sh -c命令),並且我想殺死sh和我的實際命令以及所有進一步的子進程。如果流程組甚至包含Perl解釋器會怎麼樣?難道不會發生? – oliver 2008-11-20 16:33:56