Подтвердить что ты не робот

Зависимость программы python supervisord

У меня [program:A], [program:B] в моем supervisord.conf

B depend A, означает:

A должен начинаться до B.

Как обеспечить это супервизором?

4b9b3361

Ответ 1

supervisord не поддерживает напрямую зависимости. Ваши варианты:

  • Использовать приоритеты. Установите priority для A на низкое значение, и он будет запущен до B и выключится после B. Значение по умолчанию для priority равно 999.

    Если вы поместите две программы в одну группу, это позволит вам начать и остановить их в тандеме, с приоритетами, регулирующими их начало и стоп-ордер.

  • Напишите прослушиватель событий, который прослушивает переход PROCESS_STATE STARTING -to- RUNNING и STOPPING события для A, затем проинструктируйте supervisord запустить и остановить B в соответствии с этими событиями. У вас есть A автозапуск, но отключите автозапуск для B, чтобы обработчик события контролировал его.

Ответ 2

Если вы хотите воспользоваться ярлыком и пропустить чтение документации о прослушивателя событий и пропустить модификацию ваших программ, чтобы они понимали события, тогда:

Вместо того, чтобы напрямую запускать программу B (которая зависит от A), вы можете запустить Bash script, который засыпает до тех пор, пока A не будет запущен, а затем запустится B. Например, если у вас есть база данных PostgreSQL и сервер, который не должен запускаться перед PostgreSQL:

[program:server]
autorestart=true
command=/.../start-server.sh

[program:postgres]
user=postgres
autorestart=true
command=/usr/lib/postgresql/9.3/bin/postgres ...

И затем внутри 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

Ответ 3

это - отличное решение для меня!

Обходной путь, который я использовал, - установить autostart=false на затем создайте загрузочный лоток script с помощью autostart=true и autorestart=false (один выстрел). Бутстрапом может быть оболочка scriptкоторый вызывает supervisorctl start для каждого процесса. supervisorctl startбудет блокироваться до тех пор, пока процесс не начнется успешно.

Ответ 4

Одним из решений является использование supervisorctl: установить autostart в false для программы B, а в программе, запущенной A, напишите supervisorctl start B.

Пример:

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

Программа do_a содержит:

#!/bin/bash
#do things
supervisorctl start B 

TBH это решение, предложенное @drrzmr, но я не понимал его в то время.