Я запускаю приложение Python на FreeBSD, которое использует PostgreSQL, Nginx и UWSGI. UWSGI Я управляю с SupervisorD . Мой /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 samba)
# 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
и будет отображаться как ПЕРЕД
- после него.
Вы можете добавить столько скриптов упорядочивания, сколько захотите, например, вы можете принудительно запустить 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'а, а не мое.