【问题标题】:Ruby wait for process to exitRuby 等待进程退出
【发布时间】:2018-10-26 15:43:52
【问题描述】:

在 ruby​​ 中,我需要实现一个逻辑,当父进程退出/崩溃时,当前 Ruby 进程会自动终止。

我可以使用Process.ppid获取父进程ID,但是Process模块​​上的所有等待方法都是针对子进程的。

有没有办法等待非子进程退出?

【问题讨论】:

  • 你说的是进程还是线程?在线程的情况下,创建过程应注意以良好的方式清理所有线程。 Ruby 文档很不错:thread, process
  • 处理!我在 Windows 上使用它,需要等待 Windows 进程退出。

标签: ruby


【解决方案1】:

@Ashutosh,请检查以下示例,该示例为您提到的逻辑提供了解决方案。

Process.fork { 
  ppid = Process.ppid
  while true do
    puts "Dad is #{ppid}" 
    sleep(1)
    if ppid != Process.ppid
      puts 'Dad has gone to sleep, so have I'
      Process.exit!(true)
    end
  end
}
for i in 1..5 do
  puts "I am #{Process.pid}"
  sleep(2)
end

输出:

I am 3299
Dad is 3299
Dad is 3299
I am 3299
Dad is 3299
Dad is 3299
I am 3299
Dad is 3299
Dad is 3299
I am 3299
Dad is 3299
Dad is 3299
I am 3299
Dad is 3299
Dad is 3299
Dad is 3299
Dad has gone to sleep, so have I

解释:

  • 有一个由Process.fork 分叉的子进程
  • 一开始我们保存父id,因为父终止后Process.ppid返回另一个pid,它不属于真正的父。
  • 当父进程终止时,Process.ppid 返回另一个 pid
  • 为了安全,使用Process.exit!终止子进程

如需了解更多信息,请查看Process doc

根据文档,Process 类在不同的操作系统上以非常不同的方式工作。

【讨论】:

  • 这在 Windows 上不起作用。我已经多次阅读 Process 文档,但它不起作用......甚至尝试了 stackoverflow.com/questions/325082/… 上提到的所有内容,但到目前为止仍然没有运气。
  • 另外,我无法启动任何子进程进行监控。
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
相关资源
最近更新 更多