diff options
author | Jacob Vosmaer <contact@jacobvosmaer.nl> | 2015-08-27 16:35:00 +0200 |
---|---|---|
committer | Jacob Vosmaer <contact@jacobvosmaer.nl> | 2015-08-27 16:35:00 +0200 |
commit | 1081a322f1b846fcddb3cb77f068e2e818f9d73f (patch) | |
tree | a3c30c924469a1b28ca1bf5a1a6990915db89061 | |
parent | abb5b9f6e526195c4eb027d5b7c28e070d9ac3c1 (diff) | |
download | gitlab-ce-improve-mail_room-wrapper.tar.gz |
Properly daemonize the mail_room processimprove-mail_room-wrapper
The old invocation only worked by accident because we have a '&'
somewhere in the init script for expediency. When ran from a terminal,
the mail_room daemon process ended up in the session of the terminal.
This commit adds a small wrapper that tries to do the textbook
daemonization steps (double fork, setsid etc.) while also taking
care that the pidfile is written before the 'start' process exits.
-rwxr-xr-x | bin/daemon_with_pidfile | 33 | ||||
-rwxr-xr-x | bin/mail_room | 4 |
2 files changed, 34 insertions, 3 deletions
diff --git a/bin/daemon_with_pidfile b/bin/daemon_with_pidfile new file mode 100755 index 00000000000..f138c27a0e2 --- /dev/null +++ b/bin/daemon_with_pidfile @@ -0,0 +1,33 @@ +#!/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) diff --git a/bin/mail_room b/bin/mail_room index f4f1a170c04..74a84f5b2b4 100755 --- a/bin/mail_room +++ b/bin/mail_room @@ -19,9 +19,7 @@ get_mail_room_pid() start() { - bundle exec mail_room -q -c $mail_room_config >> $mail_room_logfile 2>&1 & - PID=$! - echo $PID > $mail_room_pidfile + bin/daemon_with_pidfile $mail_room_pidfile bundle exec mail_room -q -c $mail_room_config >> $mail_room_logfile 2>&1 } stop() |