stop - supervisord python 3
Dependencia del programa Python Supervord (4)
Tengo [program:A] , [program:B] en mi supervisord.conf
B depende de A , significa:
A debe comenzar antes de B
¿Cómo asegurar esto por supervisor?
Si desea tomar un acceso directo, omitir la lectura de la documentación sobre los escuchas de eventos y omitir la modificación de sus programas para que comprendan los eventos, entonces:
En lugar de iniciar el programa B (que depende de A ) directamente, puede iniciar una secuencia de comandos Bash que se duerme hasta que se inicie A, y luego se inicia B Por ejemplo, si tiene una base de datos PostgreSQL y un servidor que no debería iniciarse antes de PostgreSQL:
[program:server]
autorestart=true
command=/.../start-server.sh
[program:postgres]
user=postgres
autorestart=true
command=/usr/lib/postgresql/9.3/bin/postgres ...
Y luego dentro de start-server.sh :
#!/bin/bash
# Wait until PostgreSQL started and listens on port 5432.
while [ -z "`netstat -tln | grep 5432`" ]; do
echo ''Waiting for PostgreSQL to start ...''
sleep 1
done
echo ''PostgreSQL started.''
# Start server.
echo ''Starting server...''
/.../really-start-the-server
Una solución es usar supervisorctl: establezca autostart en falso para el programa B, y en el programa iniciado por A, escriba supervisorctl start B
Ejemplo:
supervisor.cfg :
[supervisord]
nodaemon=false
pidfile=/tmp/supervisor.pid
logfile=/logs/supervisor.log
[unix_http_server]
file=/var/run/supervisor.sock
[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[program:A]
command=do_a
[program:B]
command=do_b
autostart=false
El programa do_a contiene:
#!/bin/bash
#do things
supervisorctl start B
TBH es la solución sugerida por @drrzmr pero no la entendí en ese momento.
this es una gran solución para mí!
Una solución que he usado es establecer
autostart=falseen los procesos, luego crear una secuencia de comandos bootstrap conautostart=trueyautorestart=false(un solo disparo). El bootstrap puede ser un script de shell que llame asupervisorctl startpara cada proceso.supervisorctl startse bloqueará hasta que el proceso se haya iniciado con éxito.
supervisord no soporta directamente dependencias. Sus opciones en cambio son:
Usa las prioridades. Establezca la
priorityparaAen un valor bajo y se iniciará antes deB, y se apagará después deBEl valor predeterminado para lapriorityes999.Si también colocas los dos programas en un solo grupo, eso te permitirá iniciarlos y detenerlos en conjunto, con las prioridades que regulan su orden de inicio y finalización.
Escriba un detector de eventos que escuche los
PROCESS_STATESTARTINGto-RUNNINGySTOPPINGparaA, luego indique asupervisordque inicie y detengaBsegún esos eventos. TengaAinicio automáticoA, pero desactive el inicio automático paraB, de modo que el controlador de eventos lo controle.