2010-03-23 34 views
37

我正在为一个学校项目编写一个ruby引导脚本,并且这个引导过程的一部分是启动几个后台进程(它们被写入并正常工作)。我想要做的事情是:在Ruby中产生一个后台进程

`/path/to/daemon1 &` 
`/path/to/daemon2 &` 
`/path/to/daemon3 &` 

但是,这会阻止第一次调用以执行daemon1。我已经看到了对Process.spawn方法的引用,但这似乎是1.9+的特性,而我仅限于Ruby 1.8。

我也试过从不同的线程执行这些守护进程,但我希望我的引导脚本能够退出。

那么我如何启动这些后台进程,以便我的引导脚本不会阻塞并可以退出(但仍然有守护进程在后台运行)?

回答

63

只要您正在使用POSIX OS,您可以使用forkexec

fork =创建子进程

exec =与另一个进程

然后你需要通知你的主要过程是无法通过Process.detach感兴趣的创建子进程替换当前进程。

job1 = fork do 
    exec "/path/to/daemon01" 
end 

Process.detach(job1) 

... 
+0

如果您正在寻找更大的东西(但仍在同一主机上),请考虑daemon_controller。 http://blog.phusion.nl/2008/08/25/daemon_controller-a-library-for-robust-daemon-management/ – Levi

+1

完美!我知道'fork'和'exec'(来自C背景),但是我错过了'Process.detach()'。谢谢! –

+0

对于我而言,OSX Lion和预安装的红宝石并不像预期的那样工作。 – nes1983

0

好了,从技术上来讲,你可以从字面上:

`/path/to/daemon1 &` 
`/path/to/daemon2 &` 
`/path/to/daemon3 &` 

但是,这不会做你想要它做的事情,很明显。

但是,您可以简单地传递&作为参数传递给system(朋友),这将后台工作。

0

更好的方式来伪deamonize:

`((/path/to/deamon1 &)&)` 

将过程拖放到它自己的外壳。

最好的办法实际上是守护进程:

`service daemon1 start` 

,并确保服务器/用户有权启动实际的守护进程。查看linux的deamonize工具来设置你的deamon。