從Perl腳本中殺死進程及其所有子進程的最佳方式是什麼?它應該至少在Linux和Solaris下運行,並且不需要安裝任何其他軟件包。我怎樣才能用Perl殺死整個進程樹?
我的猜測是通過解析/ proc中的文件或解析ps
的輸出(在Linux和Solaris之間似乎都不可移植)來獲取所有進程及其父母的列表;然後殺死樹中的所有進程(這似乎容易出現競態條件)。
我可以忍受這種特殊情況下的競爭條件,但我該如何輕鬆獲得流程列表?
從Perl腳本中殺死進程及其所有子進程的最佳方式是什麼?它應該至少在Linux和Solaris下運行,並且不需要安裝任何其他軟件包。我怎樣才能用Perl殺死整個進程樹?
我的猜測是通過解析/ proc中的文件或解析ps
的輸出(在Linux和Solaris之間似乎都不可移植)來獲取所有進程及其父母的列表;然後殺死樹中的所有進程(這似乎容易出現競態條件)。
我可以忍受這種特殊情況下的競爭條件,但我該如何輕鬆獲得流程列表?
如果你能殺死進程組住,你可以使用以下命令:
kill -$signum, $pgid;
其中$signum
是信號編號,並$pgid
是進程組ID。然而,信號的數字不是很方便攜帶,在這種情況下,你可以(在某些平臺上;讀perlfunc
進行說明)執行下列操作(發送SIGTERM
爲例):
kill 'TERM', -$pgid;
CPAN有一個答案。是的,我知道你不想安裝附加模塊,但至少你可以看看實現,看看他們在做什麼......
我適應和黑客攻擊「rkill」做工作,這很容易。
https://gitlab.com/pslist/pslist/blob/master/pslist
這在例如 「則PsList」 包的一部分Ubuntu Linux系統。
哪些進程屬於進程組?我使用IPC :: Open3來啓動一個進程(在Solaris上運行sh -c命令),並且我想殺死sh和我的實際命令以及所有進一步的子進程。如果流程組甚至包含Perl解釋器會怎麼樣?難道不會發生? – oliver 2008-11-20 16:33:56