Назад | Перейти на главную страницу

FreeBSD: запуск PostgreSQL раньше других служб

Я запускаю приложение 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, а не мое.