我在 FreeBSD 上运行一个使用 PostgreSQL、Nginx 和 UWSGI 的 Python 应用程序。我使用 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 在 PostgreSQL 启动完成之前启动了 UWSGI,这导致了错误。
有什么方法可以确保我的 UWSGI 进程在 PostgreSQL 完全启动之前不会启动?
如果忽略 UWSGI 并以某种方式告诉 FreeBSD 在 PostgreSQL 准备就绪之前甚至不要启动 SupervisorD 更容易,那么我同意。或者我应该以某种方式开始使用 SupervisorD 管理 PostgreSQL,并在其中处理所有事情?
答案1
看一眼:
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
这将向您显示脚本的运行顺序。据我了解,所有脚本都是并行启动的。只是它们的依赖项是提前启动的。
先启动一个服务再启动另一个服务的关键字(例如在 inetd 的 rc 脚本中)是
# PROVIDE: inetd
# REQUIRE: DAEMON LOGIN FILESYSTEMS
(或者在 samba 的 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
答案2
正如 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
可以构建正确的序列。
PS:请接受Daywalker的解决方案,而不是我的。