2012-12-06 33 views
2

可能重复:
Spawn a background process in Ruby运行从红宝石子,而无需等待其返回

花了几天在这个戳。直到最近,我一直在使用操作系统中的ruby 1.8.7。我会用反引号来调用子shell。子shell是一个bash包装器,它将调用在后台运行任何程序,stdout和stderr都关闭。然后,它不再让init接管该进程,并立即返回。这个工作很好,多年来,我会有这个循环过程在后台启动工作,并立即回报“是的,它跑了,这就是我告诉你的全部”。

我把所有东西都升级到rvm 1.9.3,除了这个技巧之外,一切都很好。我开始怀疑它比我想承认的更糟。在1.9.3中,当我产生子shell时,我总是会遇到EPIPE错误。它说它有一个破损的管道。我可以接受,它不会在1.9.3中工作,因为它看起来有点像1.8.7中的那样。

我试过使用系统命令,我试过open3:popen2。他们也用我称之为不合格包装的方式扔了一个EPIPE。

#!/bin/bash 

# this will crash ruby if you keep trying to read from it. 
$* >&- & 

disown %1 

这是disown包装。在红宝石我有类似

r=`/usr/local/bin/disown /usr/local/bin/job.sh` 

当这个运行时,它抛出

/usr/local/bin/runner.rb:88:in ``': Broken pipe (Errno::EPIPE) 

如果我不分配(零)输出到R变量,效果是相同的。并与系统功能和Open3:popen2。

所以我的目标是简单地从ruby运行一个命令,而不是等待它回来。它需要几个小时,我不需要跟踪它,只是产卵它。如果开始听起来像Ruby一样,我可能会尝试一个工作线程池,否则不能再执行此操作,或者如果我的disown wrapper太令人讨厌而无法获得批准。好。谢谢。

*编辑:谢谢大家的好回答。我认为卡斯帕告诉我,如果我对红宝石行话有更好的处理,我可能会把这个问题归咎于此。对不起,如果这是一个小行人。我很感谢大家的快速回答!

+1

可能要检查这些太: http://stackoverflow.com/questions/2504445/spawn-a-background-process-in-ruby和http://stackoverflow.com/questions/12220024/using-process-spawn-as-a-replacement-for-处理叉 – Casper

回答

2

用Ruby 1.9.3,u可以使用

Process.fork do 
    # do your long time job 
end 
+0

我用这个然后处理。分离。谢谢。 – mike

2

查看daemons gem。然后,你可以这样做:

require 'daemons' 
Daemons.run('some_script.rb')