花了几天在这个戳。直到最近,我一直在使用操作系统中的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太令人讨厌而无法获得批准。好。谢谢。
*编辑:谢谢大家的好回答。我认为卡斯帕告诉我,如果我对红宝石行话有更好的处理,我可能会把这个问题归咎于此。对不起,如果这是一个小行人。我很感谢大家的快速回答!
可能要检查这些太: http://stackoverflow.com/questions/2504445/spawn-a-background-process-in-ruby和http://stackoverflow.com/questions/12220024/using-process-spawn-as-a-replacement-for-处理叉 – Casper