gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:24:03 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Spawn a background process in Ruby

花了几天时间研究这个。直到最近,我一直在使用操作系统中的 ruby​​ 1.8.7。我会用反引号调用子shell。子 shell 是一个 bash 包装器,它会调用在后台运行任何程序,同时关闭 stdout 和 stderr。然后它运行 disown 让 init 接管进程,它会立即返回。这多年来一直很有效,我会让这个循环过程在后台启 Action 业并立即报告“是的,它运行了,这就是我要告诉你的”。

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

我试过使用系统命令,我试过 open3:popen2。他们还抛出了一个 EPIPE,我调用了 disown wrapper。

#!/bin/bash

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

disown %1

这是 disown 包装器。在 ruby 中我有类似的东西

    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 太令人发指而无法获得任何批准,我可能会尝试使用工作线程池。好的。谢谢。

*编辑:感谢大家的精彩回答。我认为 Casper 向我表明,如果我能更好地掌握 ruby​​ 行话,我可能会专注于此。对不起,如果这有点行人。感谢大家的快速回答!

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com