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 |
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)
I don't understand do I need to put this code inside the while loop?
echo "Processing Event: $line" >&2;
kill -3 $(cat "/var/run/supervisord.pid")
The browser needs nothing else and this will solve the memory error really, I believe it is necessary that the dead processes are killing the application when the browser consumes 1gb but just these two lines would already solve the problem?
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.