2015-07-21 51 views
0
pid = Process.fork 
#sleep 4 
Process.daemon nil, true 
if pid.nil? then 
    job.exec 
else 
    #Process.detach(pid) 
end 

pid通过Process.fork返回时只要Process.daemon(nil, true)运行改变。有没有办法保存/跟踪随后被守护进程的分叉子进程的pid?Daemonizing子进程因此改变其PID

我想知道从父进程内的子进程的PID。到目前为止,我只能通过IO.pipeProcess.pid写入IO#写入,然后使用从父节点读取的IO#读取它。不理想

回答

0

我想到的解决方案包括使用Ruby的IO将子进程中的PID传递给父进程。

r, w = IO.pipe 
pid = Process.fork 
Process.daemon nil, true 
w.puts Process.pid 
if pid.nil? then 
    job.exec 
else 
    #Process.detach(pid) 
end 

pid = r.gets 

另一种解决方案涉及调用所有具有控制终端的进程的process status

def Process.descendant_processes(base=Process.pid) 
descendants = Hash.new{|ht,k| ht[k]=[k]} 
Hash[*`ps -eo pid,ppid`.scan(/\d+/).map{|x|x.to_i}].each{|pid,ppid| 
descendants[ppid] << descendants[pid] 
} 
descendants[base].flatten - [base] 
end 
1

Process.daemon它是自己的分叉,这就是为什么pid被改变。如果您需要了解守护进程的PID,为什么不在if的分叉部分使用Process.pid?

pid = Process.fork 
#sleep 4 
Process.daemon nil, true 
if pid.nil? then 
    job.exec 
else 
    Process.detach(Process.pid) 
end 
+0

我应该更清楚我要检索'pid'的位置。我想知道父进程中的pid。 – Seph