如何确保进程在Ruby中运行

时间:2013-04-18 07:34:05

标签: ruby-on-rails ruby process monitor

我在rails中调用ffmpeg命令来grep一个流并将其推送到Wowza以便苹果设备也可以看到它,命令是这样的

Thread.new do
  `/usr/local/bin/ffmpeg -re -i http://10.191.255.90:30080/#{user.phone} -vcodec libx264 -vpre ipod640 -g 15 -acodec libvo_aacenc -ar 8000 -ac 1 -f flv rtmp://127.0.0.1/live/#{user.phone}`
end

有时这个过程会因为网络中断或其他原因而被杀死,我想知道有没有办法监控这个过程,一旦它停止我就可以重新启动它

我目前的想法是记录进程的pid,并让像resque这样的人检查给定pid的进程是否每60个sencod运行一次,但是我有很多这样的进程所以我想知道它会在以后遇到性能问题。

在Ruby中管理这些流程是否有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

您可以这样做:

Thread.new do
  begin
    Process.wait Process.spawn 'find /oeinfsroif'
    raise unless $?.exitstatus == 0
  rescue
    retry
  end
end.join

管理失败前的尝试次数:

Thread.new do
  max_attempts = 10
  attempts = 0
  begin
    Process.wait Process.spawn 'find /oeinfsroif'
    raise unless $?.exitstatus == 0
  rescue
    attempts += 1
    attempts < max_attempts ? retry : raise 
  end
end.join

输出:

find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
find: `/oeinfsroif': No such file or directory
rb:6:in `block in <main>': unhandled exception