2009-12-18 54 views

回答

12

你可以得到當前的進程:

Process.pid 

看到http://whynotwiki.com/Ruby_/_Process_management進一步的細節。

然後,您可以使用操作特定命令來獲取子pid。在基於Unix的系統,這將是沿着

# Creating 3 child processes. 
IO.popen('uname') 
IO.popen('uname') 
IO.popen('uname') 

# Grabbing the pid. 
pid = Process.pid 

# Get the child pids. 
pipe = IO.popen("ps -ef | grep #{pid}") 

child_pids = pipe.readlines.map do |line| 
    parts = line.split(/\s+/) 
    parts[2] if parts[3] == pid.to_s and parts[2] != pipe.pid.to_s 
end.compact 

# Show the child processes. 
puts child_pids 

我承認這可能不會在所有的UNIX系統的工作,我相信ps -ef輸出在不同的UNIX版本稍有不同線的東西。

+1

'Process.pid'返回當前進程的pid,而不是父進程。要獲得父進程pid,請執行'Process.ppid'。 – henrikhodne 2009-12-19 16:42:16

+0

只是在註釋中出現錯誤,我們需要當前進程,因爲這將是子進程的父進程。 – Jamie 2009-12-19 16:52:47

+5

只需幾美分:「ps o pid = --ppid#{pid}」可能比「ps -ef | grep#{pid}」更方便,在這種情況下您不必過濾掉不需要的行和字段。 – timurb 2012-02-15 15:13:22

6

Process.fork以產生的孩子的PID作出響應。當你產卵的時候,只需要跟蹤它們。請參閱http://ruby-doc.org/core/classes/Process.html#M003148

+0

這將是一個很好的變體,但在我的情況下,我有一個方法產生一個塊和唯一的方法來跟蹤所有調用fork,system,spawn,backtrick和其他人通過pid counter鏈接這些方法,但我希望有更簡單的方法來獲得兒童pid – tig 2009-12-22 16:45:47

2

可以用sys-proctable寶石來也做:

require 'sys/proctable' 

Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ } 
0

這實際上是安靜的複雜,是特定的平臺。你實際上不能找到所有的子流程,如果他們故意試圖隱藏。

如果你想殺死衍生的進程有很多選項。對於一個測試框架,我選擇了兩個: 1.產生與pgid => true 進程的進程2.插入變量MY_CUSTOM_COOKIE=asjdkahf,然後在環境中找到具有該cookie的過程並殺死它。

僅供參考使用ps找出過程層次結構是非常不可靠的。如果鏈中的一個進程退出,那麼其子進程將獲得一個父進程pid 1(至少在Linux上)。所以這不值得實施。