Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Kill supervisor on Docker when any of the services fail

Killing supervisor if any of it's child processes fail

The trick is to only register the listener for events that indicate failure, namely

  • PROCESS_STATE_STOPPED
  • PROCESS_STATE_EXITED
  • PROCESS_STATE_FATAL

Once they do, we should send a SIGQUIT to Supervisor.

#!/bin/bash
printf "READY\n";
while read line; do
echo "Processing Event: $line" >&2;
kill -3 $(cat "/var/run/supervisord.pid")
done < /dev/stdin
[supervisord]
nodaemon=true
loglevel=debug
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor
[program:nginx]
command=nginx -g "daemon off;"
redirect_stderr=true
[program:php-fpm]
command=php-fpm
redirect_stderr=true
[eventlistener:processes]
command=stop-supervisor.sh
events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL
@JonathonReinhart

This comment has been minimized.

Copy link

@JonathonReinhart JonathonReinhart commented Jan 18, 2019

Here's a small improvement:

  • Use -SIGQUIT rather than hard-coding the signal name
  • Use $PPID to get the PID of supervisord (the parent of the event listener)
 while read line; do
   echo "Processing Event: $line" >&2;
-  kill -3 $(cat "/var/run/supervisord.pid")
+  kill -SIGQUIT $PPID
 done < /dev/stdin
@sqqqrly

This comment has been minimized.

Copy link

@sqqqrly sqqqrly commented Aug 21, 2019

You could also use supervisorctl shutdown. If you run shutdown from within the supervisorctl shell, you get prompted for confirmation. From a bash shell, there is no prompt and supervisord exits.

@albertoammar

This comment has been minimized.

Copy link

@albertoammar albertoammar commented Feb 25, 2020

Here's a small improvement:

  • Use -SIGQUIT rather than hard-coding the signal name
  • Use $PPID to get the PID of supervisord (the parent of the event listener)
 while read line; do
   echo "Processing Event: $line" >&2;
-  kill -3 $(cat "/var/run/supervisord.pid")
+  kill -SIGQUIT $PPID
 done < /dev/stdin

Thanks, your save my soul

@clayrisser

This comment has been minimized.

Copy link

@clayrisser clayrisser commented Oct 17, 2020

For those who don't want a separate file 😄

[supervisord]
loglevel=warn
nodaemon=true

[program:hi]
command=bash -c "echo waiting 5 seconds . . . && sleep 5"
autorestart=false
numprocs=1
startsecs=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

[eventlistener:processes]
command=bash -c "printf 'READY\n' && while read line; do kill -SIGQUIT $PPID; done < /dev/stdin"
events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment