如何解雇并忘记子进程?

kch*_*kch 22 ruby unix fork process

我有一个漫长的运行过程,我需要它来启动另一个进程(这将运行一段时间).我只需要启动它,然后完全忘记它.

我设法通过从编程Ruby书中搜索一些代码来做我需要的东西,但我想找到最佳/正确的方法,并了解正在发生的事情.这是我最初得到的:

exec("whatever --take-very-long") if fork.nil?
Process.detach($$)
Run Code Online (Sandbox Code Playgroud)


那么,这是方式,还是我应该怎么做呢?

检查下面的答案后,我最终得到了这段代码,这似乎更有意义:

(pid = fork) ? Process.detach(pid) : exec("foo")
Run Code Online (Sandbox Code Playgroud)


我很欣赏有关如何fork运作的一些解释.[已经得到了]

分离$$对吗?我不知道为什么会这样,我真的很想更好地掌握这种情况.

Mat*_*hen 31

Alnitak是对的.这是一种更明确的编写方式,没有$$

pid = Process.fork
if pid.nil? then
  # In child
  exec "whatever --take-very-long"
else
  # In parent
  Process.detach(pid)
end
Run Code Online (Sandbox Code Playgroud)

分离的目的只是说,"当孩子终止时我不在乎"以避免僵尸进程.


Aln*_*tak 20

fork功能将您的过程分为两部分.

然后两个进程都会收到函数的结果.孩子接收零值/ nil(因此知道它是孩子)并且父亲接收孩子的PID.

因此:

exec("something") if fork.nil?
Run Code Online (Sandbox Code Playgroud)

将使子进程启动"某事",并且父进程将继续进行.

请注意,用"something" exec() 替换当前进程,因此子进程永远不会执行任何后续的Ruby代码.

调用Process.detach()看起来可能不正确.我原以为它会有孩子的PID,但如果我正确读取你的代码,它实际上是在分离父进程.

  • 只需调用fork并捕获结果.那么如果你没有,那就去执行,否则你就是父母. (2认同)