Я запускаю приложение Python на FreeBSD, которое использует PostgreSQL, Nginx и UWSGI. UWSGI Я справляюсь с СупервайзерD. Мой /etc/rc.conf
выглядит так:
...
postgresql_enable="YES"
nginx_enable="YES"
supervisord_enable="YES"
SupervisorD запускает несколько разных процессов UWSGI, но все их файлы конфигурации выглядят примерно так:
[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /opt/site/uwsgi/site.ini
autostart=True
autorestart=True
user=example
stopsignal=INT
redirect_stderr=True
stdout_logfile=/opt/site/log/uwsgi.log
stdout_logfile_maxbyte=5MB
stdout_logfile_backups=10
priority=300
Все запускается нормально. Однако я столкнулся с проблемой, когда при перезагрузке сервера SupervisorD запускал UWSGI до завершения запуска PostgreSQL, что вызывало ошибку.
Есть ли способ убедиться, что мои процессы UWSGI не запускаются, пока PostgreSQL не будет полностью запущен?
Если проще игнорировать UWSGI и каким-то образом сказать FreeBSD, чтобы она даже не запускала SupervisorD, пока PostgreSQL не будет готов, меня это устраивает. Или мне как-то начать управлять PostgreSQL с помощью SupervisorD и заниматься всем этим?
Взгляни на:
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
Это покажет вам порядок, в котором запускаются скрипты. Как я понял, все скрипты запускаются параллельно. juist их зависимости запускаются заранее.
Ключевое слово, которое запускает одну Службу раньше другой. (например, в сценарии rc inetd) является
# PROVIDE: inetd
# REQUIRE: DAEMON LOGIN FILESYSTEMS
(или в rc скрипте самбы)
# PROVIDE: samba_server
# REQUIRE: NETWORKING SERVERS DAEMON ldconfig resolv ntpd
# BEFORE: LOGIN
Просто вставьте все необходимые сценарии rc, которые необходимо запустить перед вашим сервисом.
Из справочника:
Имейте в виду, что указание имени службы в строке REQUIRE: не гарантирует, что служба действительно будет запущена к моменту запуска нашего скрипта. Требуемая служба может не запуститься или просто отключена в rc.conf (5). Очевидно, что rcorder (8) не может отслеживать такие детали, и rc (8) не будет этого делать. Следовательно, приложение, запущенное нашим скриптом, должно уметь справляться с недоступностью любых необходимых сервисов. В некоторых случаях мы можем помочь, как описано ниже.
Найдите ссылку на главу Руководства FreeBSD по этой теме: https://www.freebsd.org/doc/en/articles/rc-scripting/rcng-hookup.html
Как упоминал Daywalker, вы должны добавить несколько специальных rc.d
сценарий:
# PROVIDE: MYORDER001
# REQUIRE: postgresql
# BEFORE: nginx supervisord exim dovecot ...
когда rc
запустить систему, все rc
скрипты анализируются для построения неконфликтной последовательности запуска. Вы можете перечислить эту последовательность
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
Имейте в виду, что это не окончательная последовательность, а только первая найденная неконфликтная последовательность. Когда вы добавляете MYORDER001
, rcorder
может построить другую подходящую последовательность, которая гарантирует, что postgresql
будет начато раньше MYORDER001
и указан как BEFORE
- после этого.
Вы можете добавить столько скриптов заказа, сколько захотите, например, вы можете принудительно dovecot
быть начато раньше exim
если вы использовали dovecot-auth
из exim
:
# PROVIDE: MYORDER002
# REQUIRE: dovecot
# BEFORE: exim
Тогда можете быть уверены, что postgresql
предшествуют обоим dovecot
и exim
, и dovecot
предшествовать exim
.
Единственное требование - запустить
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
каждый раз, когда вы изменяли свой rc
скрипты, чтобы убедиться, что нет конфликтов в приоритете и rcorder
можно построить правильную последовательность.
P.S. Пожалуйста, примите решение Daywalker, а не мое.