2017-05-30 54 views
1

以下代碼會分叉主進程並在反引號中運行命令。腳本結尾處的kill只會殺死分叉的進程,但不會是子進程(即sleep命令)。在子進程中使用紅寶石殺死分叉進程

pid = fork do 
    Thread.new do 
    `sleep 20` 
    end 
end 
sleep(1) 
Process.kill("HUP",pid) 

難道還有比通過進程樹尋找其他的方式來殺死所有的子進程(線程中的分叉過程反引號命令生成的)?

回答

2

幕後發生系統和反引號操作使用叉子叉 當前進程,然後他們執行使用 EXEC給定的操作。

由於exec替換當前進程,所以如果 操作成功,它不會返回任何內容。如果操作失敗,則引發 SystemCallError。

http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html

+0

所以我想答案是否定的,你必須搜索進程樹 – jhj

0

您可以使用

pid = Process.spawn('sleep 20') 

立即獲得進程的PID。你上面的代碼將變爲:

pid = Process.spawn('sleep 20') 
sleep(1) 
Process.kill('HUP',pid)