花了几天时间戳了一下。我从操作系统直到最近才使用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术语有更好的处理,我可能会对此进行调整。对不起,如果这有点行人。我很欣赏每个人的快速答案!
答案 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");