我在FreeBSD上运行一个使用PostgreSQL,Nginx和UWSGI的python应用程序。 UWSGI我与SupervisorD一起pipe理。 我的/etc/rc.conf如下所示:
... postgresql_enable="YES" nginx_enable="YES" supervisord_enable="YES"
SupervisorD启动了几个不同的UWSGI进程,但是他们的configuration文件几乎看起来像这样:
[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在PostgreSQL启动完成之前启动了UWSGI,这导致了一个错误。
有没有一种方法可以确保我的UWSGI进程在PostgreSQL完全启动之前不会启动?
如果更容易忽略UWSGI,并告诉FreeBSD甚至在PostgreSQL准备好之前不要启动SupervisorD,那么我很好。 或者我应该以某种方式开始用SupervisorDpipe理PostgreSQL,并处理所有内容?
看一眼:
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
这将显示脚本的运行顺序。 正如我所理解的,所有脚本都是并行启动的。 juist他们的依赖关系是事先启动的。
在另一个之前启动服务的关键字(例如,在inetd的rc脚本中)是
# PROVIDE: inetd # REQUIRE: DAEMON LOGIN FILESYSTEMS
(或在桑巴脚本)
# PROVIDE: samba_server # REQUIRE: NETWORKING SERVERS DAEMON ldconfig resolv ntpd # BEFORE: LOGIN
只需input所有需要在您的服务之前启动的必需的rc脚本。
从手册:
请记住,在REQUIRE:行中放置一个服务名称并不能保证在我们的脚本开始的时候服务将会真正运行。 所需的服务可能无法启动或仅在rc.conf(5)中被禁用。 显然,rcorder(8)不能跟踪这些细节,rc(8)也不会这样做。 因此,由我们的脚本启动的应用程序应该能够处理任何所需的服务不可用。 在某些情况下,我们可以帮助它,如下所述。
Finlay链接到关于该主题的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脚本以build立非冲突的启动顺序。 你可以按顺序列出这个序列
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
请记住,这不是一个最终的顺序,但只是第一个没有冲突的发现。 在添加MYORDER001 , rcorder可以build立另一个适当的序列,确保postgresql在MYORDER001 BEFORE启动,并在BEFORE列出为BEFORE 。
您可以根据需要添加尽可能多的订购脚本,例如,如果您使用了来自exim dovecot-auth ,则可以强制dovecot在exim之前启动:
# PROVIDE: MYORDER002 # REQUIRE: dovecot # BEFORE: exim
那么你可以确定postgresql先于dovecot和exim ,而dovecot先于exim 。
唯一的要求是运行
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
每次您修改了您的rc脚本以确保优先级没有冲突,并且rcorder可以build立正确的序列。
PS请接受Daywalker的解决scheme不是我的。