How to fire and forget a subprocess?

kch picture kch · Apr 30, 2009 · Viewed 14.9k times · Source

I have a long running process and I need it to launch another process (that will run for a good while too). I need to only start it, and then completely forget about it.

I managed to do what I needed by scooping some code from the Programming Ruby book, but I'd like to find the best/right way, and understand what is going on. Here's what I got initially:

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


So, is this the way, or how else should I do it?

After checking the answers below I ended up with this code, which seems to make more sense:

(pid = fork) ? Process.detach(pid) : exec("foo")


I'd appreciate some explanation on how fork works. [got that already]

Was detaching $$ right? I don't know why this works, and I'd really love to have a better grasp of the situation.

Answer

Matthew Flaschen picture Matthew Flaschen · Apr 30, 2009

Alnitak is right. Here's a more explicit way to write it, without $$

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

The purpose of detach is just to say, "I don't care when the child terminates" to avoid zombie processes.