У меня [program:A], [program:B] в моем supervisord.conf
B depend A, означает:
A должен начинаться до B.
Как обеспечить это супервизором?
У меня [program:A], [program:B] в моем supervisord.conf
B depend A, означает:
A должен начинаться до B.
Как обеспечить это супервизором?
supervisord не поддерживает напрямую зависимости. Ваши варианты:
Использовать приоритеты. Установите priority для A на низкое значение, и он будет запущен до B и выключится после B. Значение по умолчанию для priority равно 999.
Если вы поместите две программы в одну группу, это позволит вам начать и остановить их в тандеме, с приоритетами, регулирующими их начало и стоп-ордер.
Напишите прослушиватель событий, который прослушивает переход PROCESS_STATE STARTING -to- RUNNING и STOPPING события для A, затем проинструктируйте supervisord запустить и остановить B в соответствии с этими событиями. У вас есть A автозапуск, но отключите автозапуск для B, чтобы обработчик события контролировал его.
Если вы хотите воспользоваться ярлыком и пропустить чтение документации о прослушивателя событий и пропустить модификацию ваших программ, чтобы они понимали события, тогда:
Вместо того, чтобы напрямую запускать программу 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
это - отличное решение для меня!
Обходной путь, который я использовал, - установить
autostart=falseна затем создайте загрузочный лоток script с помощьюautostart=trueиautorestart=false(один выстрел). Бутстрапом может быть оболочка scriptкоторый вызываетsupervisorctl startдля каждого процесса.supervisorctl startбудет блокироваться до тех пор, пока процесс не начнется успешно.
Одним из решений является использование 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, но я не понимал его в то время.