python supervisord程序依赖

时间:2013-07-03 08:55:36

标签: python supervisord

我的supervisord.conf中有[program:A][program:B]

B依赖A,表示:

A应该在B之前开始。

如何由主管确保?

4 个答案:

答案 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 startsupervisorctl 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建议的解决方案,但我当时并不理解。