supervisorctl stop raspberry new example python supervisord

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 con autostart=true y autorestart=false (un solo disparo). El bootstrap puede ser un script de shell que llame a supervisorctl 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 para A en un valor bajo y se iniciará antes de B , y se apagará después de B El valor predeterminado para la priority es 999 .

    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 y STOPPING para A , luego indique a supervisord que inicie y detenga B según esos eventos. Tenga A inicio automático A , pero desactive el inicio automático para B , de modo que el controlador de eventos lo controle.