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 |
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.
Here's a small improvement:
- Use
-SIGQUIT
rather than hard-coding the signal name- Use
$PPID
to get the PID ofsupervisord
(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
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
I've found the approach mentioned in this comment much more simple.
Supervisor/supervisor#712 (comment)
Here's a small improvement:
-SIGQUIT
rather than hard-coding the signal name$PPID
to get the PID ofsupervisord
(the parent of the event listener)