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=false
en los procesos, luego crear una secuencia de comandos bootstrap conautostart=true
yautorestart=false
(un solo disparo). El bootstrap puede ser un script de shell que llame asupervisorctl start
para cada proceso.supervisorctl start
se 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
priority
paraA
en un valor bajo y se iniciará antes deB
, y se apagará después deB
El valor predeterminado para lapriority
es999
.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_STATE
STARTING
to-RUNNING
ySTOPPING
paraA
, luego indique asupervisord
que inicie y detengaB
según esos eventos. TengaA
inicio automáticoA
, pero desactive el inicio automático paraB
, de modo que el controlador de eventos lo controle.