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 |
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?
Thanks, your save my soul