如何在Ruby中启动后台进程?

时间:2011-04-11 18:54:05

标签: ruby background elastic-beanstalk

我在Ruby中启动后台进程时遇到了一些困难。

我现在有这个代码。

#!/usr/bin/env ruby -w
require "daemons"
require 'rubygems'

path = "#{File.expand_path(File.dirname(__FILE__))}/.."

Daemons.run_proc('stalker',{
  :dir_mode => :normal,
  :dir => "#{path}/tmp/pids",
  :backtrace => true,
  :monitor => false,
  :log_output => true
}) do
  system "stalk #{path}/config/jobs.rb"
end

然后我使用script/stalker start启动脚本。

问题在于我无法阻止它。它将错误的PID保存到pid文件中。

像这样:

script/stalker start
=> stalker: process with pid **39756** started.

ps aux | grep ruby 
=> linus    **39781**   0,3  1,9  2522752  78864   ??  S     8:39pm   0:10.11 ruby stalk script/../config/jobs.rb

为什么第一个pid与使用ps aux | grep ruby打印的pid不匹配?

我尝试使用exec%x{}和一个system来运行脚本。

1 个答案:

答案 0 :(得分:3)

如果您使用run_proc,您想要守护进程的代码应该在块中。使用system启动另一个进程没有意义(它将fork进程(给你另一个pid),然后exec你的jobs.rb脚本。移动代码jobs.rb阻止run_proc,或使用Daemons.run