Running daemons under Supervisord

When you want to run multiple processes in a single Docker container, there’s a few ways to do this.  Launch scripts is one.  I chose to use Supervisord.  Supervisord has some cool features, but it’s intended to manage processes that don’t fork (daemonize) themselves.  If you have something that you want to run under Supervisord that you cannot stop from forking, you can use the following script to monitor it;

#! /usr/bin/env bash

set -eu

pidfile="/var/run/your-daemon.pid"
command="/usr/sbin/your-daemon"

# Proxy signals
function kill_app(){
 kill $(cat $pidfile)
 exit 0 # exit okay
}
trap "kill_app" SIGINT SIGTERM

# Launch daemon
$command
sleep 2

# Loop while the pidfile and the process exist
while [ -f $pidfile ] && kill -0 $(cat $pidfile) ; do
 sleep 0.5
done
exit 1000 # exit unexpected

Run that script with supervisord.  What will happen is the script will monitor your daemon until it exits for some reason, then the script will exit, resulting in supervisord taking action.

Solution found at Serverfault.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.