我的supervisord.conf中有[program:A]
,[program:B]
B
依赖A
,表示:
A
应该在B
之前开始。
如何由主管确保?
答案 0 :(得分:22)
supervisord
不直接支持依赖项。您的选择是:
使用优先级。将priority
的{{1}}设置为较低的值,它将在A
之前启动,并在B
之后关闭。 B
的默认值为priority
。
如果你把这两个程序放在一个组中,那就可以让你同时启动和停止它们,并优先考虑它们的启动和停止顺序。
撰写event listener,为999
收听PROCESS_STATE
STARTING
- 至 - RUNNING
转化和STOPPING
事件,然后指示A
根据这些事件开始和停止supervisord
。有B
自动启动,但禁用A
的自动启动,以便事件处理程序控制它。
答案 1 :(得分:6)
如果您想要使用快捷方式,并跳过阅读有关event listeners的文档并跳过修改您的程序以便他们了解事件,那么:
而不是直接启动程序B
(取决于A
),您可以启动一个Bash脚本,该脚本在A
启动之前休眠,然后启动B
。例如,如果你有一个PostgreSQL数据库和一个不应该在PostgreSQL之前启动的服务器:
[program:server]
autorestart=true
command=/.../start-server.sh
[program:postgres]
user=postgres
autorestart=true
command=/usr/lib/postgresql/9.3/bin/postgres ...
然后在start-server.sh
内:
#!/bin/bash
# Wait until PostgreSQL started and listens on port 5432.
while [ -z "`netstat -tln | grep 5432`" ]; do
echo 'Waiting for PostgreSQL to start ...'
sleep 1
done
echo 'PostgreSQL started.'
# Start server.
echo 'Starting server...'
/.../really-start-the-server
答案 2 :(得分:3)
this对我来说是一个很好的解决方案!
我使用的解决方法是设置
autostart=false
进程,然后使用autostart=true
创建一个引导脚本autorestart=false
(一次性)。引导程序可以是shell脚本 为每个进程调用supervisorctl start
。supervisorctl start
将阻止,直到进程成功启动。
答案 3 :(得分:3)
一种解决方案是使用supervisorctl:为程序B设置autostart为false,在A启动的程序中,写supervisorctl start B
。
示例:
supervisor.cfg
:
[supervisord]
nodaemon=false
pidfile=/tmp/supervisor.pid
logfile=/logs/supervisor.log
[unix_http_server]
file=/var/run/supervisor.sock
[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[program:A]
command=do_a
[program:B]
command=do_b
autostart=false
do_a
程序包含:
#!/bin/bash
#do things
supervisorctl start B
TBH这是@drrzmr建议的解决方案,但我当时并不理解。