从ruby运行子进程而不等待它返回

时间:2012-12-06 02:20:20

标签: ruby subshell epipe

  

可能重复:
  Spawn a background process in Ruby

花了几天时间戳了一下。我从操作系统直到最近才使用ruby 1.8.7。我会用反引号调用子shell。子shell是一个bash包装器,它将调用后台运行任何程序,stdout和stderr都关闭。然后运行disown让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

这是不公开的包装器。在红宝石中我有类似

的东西
    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包装器太令人发指而无法得到任何批准。好。感谢。

*编辑:感谢大家的精彩回答。我认为卡斯帕告诉我,如果我对ruby术语有更好的处理,我可能会对此进行调整。对不起,如果这有点行人。我很欣赏每个人的快速答案!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

在Ruby 1.9.3中,你可以使用

 Process.fork do
   # do your long time job
 end

答案 2 :(得分:2)

嗯,你自己回答:Process.spawn

Process.spawn("something");