Background Process

This is like popen4, but provides several convenience methods for interacting with the process. It only works on POSIX and Ruby implementations that support fork and native POSIX I/O streams.

Click here for Complete Documentation

Example:


process = BackgroundProcess.run("sh -c 'sleep 1; exit 1'")
process.running? # => true
process.wait # => #<Process::Status: pid=34774,exited(1)>
process.running? #=> false
process.exitstatus # => 1

process = BackgroundProcess.run("sh", "-c", "sleep 1; exit 1")
process.kill("KILL") # => true
process.running? # => false
process.exitstatus # => nil

process = BackgroundProcess.run("sh -c '
  echo Service Starting
  sleep 2
  echo Service Started 1>&2
'")
if process.detect(:stderr, 10) { |line| line.include?("Service Started") }
  puts "Service was started!"
else
  puts "Service failed to start!"
end
process.kill

Common signal names

Name id
HUP 1
INT 2
QUIT 3
ABRT 6
KILL 9
ALRM 14
TERM 15
USR1 30
USR2 31

A word about buffered output

Some processes (like Ruby) buffer their output if they detect that they aren’t attached to a tty. This means that unless the program explicitly calls STDOUT.flush, much of the output won’t be available for reading until the buffer is full, forcing it to be flushed.

You can force the output of a ruby script to be unbuffered by using a wrapper like the following:


  BackgroundProcess.run %(ruby -e 'STDERR.sync, STDOUT.sync = true, true; $0="./server.rb"; load "server.rb"')

If no such workaround is available, this gem provides PTYBackgroundProcess which will wrap the command any pseudo-terminal interface. This has the advantage of forcing many programs to not buffer their output, but at a disadvantage too (you can’t get the exit status of the process, you lose any output that hasn’t been read yet when the process exits, and stderr gets merged into stdout). It seems there should be ways to work around these limitations, but I wasn’t able to figure out an way to do it (without resorting to C code at least). Given your circumstances, this may fit your needs and be a viable solution to you.

Please see the documentation for BackgroundProcess.run and PTYBackgroundProcess.run for further information.

Author

Tim Harper, on behalf of Lead Media Partners