在ruby中运行console命令,获取子进程的PID并在几秒钟内终止它

时间:2014-12-04 21:33:46

标签: ruby process io command pid

我需要在ruby中运行console命令(在我的情况下启动Gvim),获取Gvim的PID并在几秒钟内终止该进程。

如果我执行以下操作 - 它为我提供了父进程的PID,但我需要以某种方式找出Gvim的PID。

IO.popen("gvim file_name_to_open" { |gvim|
  puts gvim.pid
}

如果我执行以下操作,它只会启动Gvim而不会执行任何操作(我需要杀死Gvim进程)。

pid = Process.spawn("gvim", "file_name_to_open")
sleep(5)
Process.kill(9, pid)
Process.wait pid

我做错了什么?

1 个答案:

答案 0 :(得分:1)

最合适的解决方案如下:

parent_pid = Process.spawn("gvim", "file_name_to_open")
# Need to wait in order not to kill process till Gvim is started and visible
sleep(5)  
Process.kill(9, parent_pid)
# Try to get all Gvim PIDs: the result will look like list of PIDs in 
# descending order, so the first one is the last Gvim opened.
all_gvim_pids = `pidof gvim` 
last_gvim_pid = all_gvim_pids.split(' ').map(&:to_i).first
Process.kill(9, last_gvim_pid)

解决方案很奇怪,而且没有人有更好的想法:(