如何运行并忘记子进程?

我有一个漫长的流程,我需要它来推出另一个进程 /这也将工作相当长的时间/. 我只需要开始它,然后忘记他。

我设法做了我所拥有的事情,从书中拿出一点代码 Programming Ruby, 但我想找到最好的/正确的方法,了解正在发生的事情。 这就是我最初得到的:


exec/"whatever --take-very-long"/ if fork.nil?
Process.detach/$$/



所以,是吗,或者我应该怎么做这个?

在检查下面的答案后,我收到了这段代码似乎有更多的意义

:


/pid = fork/ ? Process.detach/pid/ : exec/"foo"/



我会感激一些关于它如何运作的解释
fork

. [已经理解]

无论是断开连接
$$

? 我不知道为什么它有效,我真的很想更好地了解情况。
已邀请:

涵秋

赞同来自:

alnika对。 这是一种更清晰的方式来写它,没有 $$


pid = Process.fork
if pid.nil? then
# In child
exec "whatever --take-very-long"
else
# In parent
Process.detach/pid/
end


目的 detach - 说啊 "I don't care when the child terminates" 避免
http://en.wikipedia.org/wiki/Zombie_process
.

帅驴

赞同来自:

功能
fork

将您的进程分为两部分。

然后两者

该过程是通过该功能的结果获得的。 孩子获得了价值 zero/
nil

/因此,知道这是一个孩子/, 父母获得了价值 PID 孩子。

所以:


exec/"something"/ if fork.nil?


将使子流程开始 "something", 父流程将从他所在的地方继续。

注意
exec//


重播

目前的过程 "something", 因此,子进程永远不会执行任何后续代码。 Ruby.

称呼
Process.detach//

它看起来好像他可能错了。 我期待它会是 PID 孩子,但如果我正确阅读了你的代码,那么事实上他会断开父进程。

石油百科

赞同来自:

断开连接
$$

那是错的。 来自p。 348 挑选 /2-是ed。/:


$$

Fixnum 正在执行的程序的处理编号。 [r/o]

本节, "Variables and Constants" 在章节中 "Ruby Language", 非常方便解码各种各样 ruby 短的
$

恒定的在线版 /第一的

事实上,您将该计划与她的孩子分开,而不是她的孩子。
作为其他事情已经发言,与孩子分开的正确方法是使用它 pid 孩子回来了
fork//

.

喜特乐

赞同来自:

如果您确定要断开子进程,其他答案很好。 但是,如果要么不对象,或者更喜欢保存所附的子进程 /例如,你运行 sub-servers/services 对于Web应用程序/, 然后你可以利用下一个壁纸


fork do
exec/'whatever --option-flag'/
end


提供块表示 fork 运行此块 /而且只有这个街区/ 在儿童过程中,继续在父母工作。

诸葛浮云

赞同来自:

我发现了上面的答案,打破了我的 terminal 并宠坏了这一结论。 这是我发现的解决方案。


system/"nohup ./test.sh &"/


如果有人有同样的问题,我的目标是进入服务器 ssh, 然后继续这个过程无限制地工作。 所以 test.sh 这是


#!/usr/bin/expect -f
spawn ssh host -l admin -i cloudkey
expect "pass"
send "superpass\r"
sleep 1000000

要回复问题请先登录注册