【问题标题】:Kill Process started by IO.popen automatically if parent ruby script is killed如果父 ruby​​ 脚本被杀死,则由 IO.popen 自动启动终止进程
【发布时间】:2013-04-01 03:37:00
【问题描述】:

我正在尝试从 Windows 中的 ruby​​ 脚本运行 ffmpeg。

def execute_ffmpeg(command)
  IO.popen(command){|io|
    io.each{|line|
      # Show Progress
    }
  }
end
command_ffmpeg = "ffmpeg -y -i input.avi -vb 1000k -ab 96k output.mp4 2>&1"
execute_ffmpeg(command_ffmpeg)

如果我等到编码完成,它可以正常工作。 但是如果我终止 ruby​​ 脚本,ffmpeg 的进程仍然是后台。

如何在父 ruby​​ 进程终止时终止 ffmpeg 进程?

我在 Windows 7 中使用 ruby​​ 1.9.3。

【问题讨论】:

    标签: ruby io pipe popen


    【解决方案1】:

    让子进程与父进程共享管道。在子进程中有一个线程调用 IO.select 。如果管道关闭,您就知道父进程已死。实施见https://github.com/vaneyckt/Adeona/blob/master/lib/adeona.rb

    编辑:刚刚注意到您使用的是 Windows 7。不确定我的方法是否适用于 Windows。

    【讨论】:

    • 感谢您的回复。正如你提到的,因为 fork 我无法在 Windows 中运行代码。我一遍又一遍地阅读您的代码和参考手册。但我无法重写它。等我了解IO基础后再去查。
    猜你喜欢
    • 2013-03-26
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多