FreeBSD: Запуск PostgreSQL перед другими службами

Я запускаю приложение 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, и обрабатывать все в нем?

1
задан 21 August 2016 в 04:35
2 ответа

Взгляните на:

# 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

2
ответ дан 3 December 2019 в 20:35

Как упоминал 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'а, а не мое.

0
ответ дан 3 December 2019 в 20:35

Теги

Похожие вопросы