34 lines
716 B
Text
34 lines
716 B
Text
|
#!/usr/bin/env ruby
|
||
|
# daemon_with_pidfile
|
||
|
#
|
||
|
# Daemonize, write a pidfile, and exec the remainder of the command line.
|
||
|
|
||
|
def main(pidfile, cmd)
|
||
|
if middle_pid = Process.fork
|
||
|
# outer process
|
||
|
# Do not exit the outer process before the middle process finishes
|
||
|
Process.waitpid(middle_pid)
|
||
|
exit $?.exitstatus
|
||
|
end
|
||
|
|
||
|
if final_pid = Process.fork
|
||
|
# middle process
|
||
|
open(pidfile, 'w') { |f| f.puts final_pid }
|
||
|
exit
|
||
|
end
|
||
|
|
||
|
# Standard daemon things: become session leader, ignore SIGHUP, close stdin.
|
||
|
Signal.trap("HUP", "IGNORE")
|
||
|
Process.setsid
|
||
|
IO.new(0).close
|
||
|
|
||
|
exec(*cmd)
|
||
|
end
|
||
|
|
||
|
if ARGV.count < 2
|
||
|
abort "Usage: #$0 pidfile command [args...]"
|
||
|
end
|
||
|
|
||
|
pidfile = ARGV.shift
|
||
|
main(pidfile, ARGV)
|