summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <contact@jacobvosmaer.nl>2015-08-27 16:35:00 +0200
committerJacob Vosmaer <contact@jacobvosmaer.nl>2015-08-27 16:35:00 +0200
commit1081a322f1b846fcddb3cb77f068e2e818f9d73f (patch)
treea3c30c924469a1b28ca1bf5a1a6990915db89061
parentabb5b9f6e526195c4eb027d5b7c28e070d9ac3c1 (diff)
downloadgitlab-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-xbin/daemon_with_pidfile33
-rwxr-xr-xbin/mail_room4
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()