У меня [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, но я не понимал его в то время.