How to fire and forget a subprocess? How to fire and forget a subprocess? unix unix

How to fire and forget a subprocess?


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

pid = Process.forkif 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.


The fork function separates your process in two.

Both processes then receive the result of the function. The child receives a value of zero/nil (and hence knows that it's the child) and the parent receives the PID of the child.

Hence:

exec("something") if fork.nil?

will make the child process start "something", and the parent process will carry on with where it was.

Note that exec() replaces the current process with "something", so the child process will never execute any subsequent Ruby code.

The call to Process.detach() looks like it might be incorrect. I would have expected it to have the child's PID in it, but if I read your code right it's actually detaching the parent process.


Detaching $$ wasn't right. From p. 348 of the Pickaxe (2nd Ed):

$$ Fixnum The process number of the program being executed. [r/o]

This section, "Variables and Constants" in the "Ruby Language" chapter, is very handy for decoding various ruby short $ constants - however the online edition (the first

So what you were actually doing was detaching the program from itself, not from its child.Like others have said, the proper way to detach from the child is to use the child's pid returned from fork().