pythonsupervisord程序依赖

问题描述 投票:0回答:5

我的supervisord.conf中有

[program:A]
[program:B]

B
取决于
A
,意思是:

A
应在
B
之前开始。

主管如何确保这一点?

python supervisord
5个回答
35
投票

supervisord
不直接支持依赖关系。您的选择是:

  • 使用优先级。将

    priority
    A
    设置为较低值,它将在
    B
    之前启动,并在
    B
    之后关闭。
    priority
    的默认值为
    999

    如果您也将这两个程序放入一组,则可以同时启动和停止它们,并通过优先级来调节它们的启动和停止顺序。

  • 编写一个 事件监听器,监听

    PROCESS_STATE
    STARTING
    -to-
    RUNNING
    转换和
    STOPPING
    A
    事件,然后根据这些事件指示
    supervisord
    启动和停止
    B
    。具有
    A
    自动启动功能,但禁用
    B
    自动启动,以便事件处理程序控制它。


12
投票

如果您想走捷径,跳过阅读有关 事件侦听器 的文档并跳过修改程序以使其理解事件,那么:

您可以启动一个 Bash 脚本,该脚本会休眠直到启动

B
,然后启动
A
,而不是直接启动程序
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

5
投票

一种解决方案是使用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 建议的解决方案,但我当时不明白。


3
投票

对我来说是一个很好的解决方案!

我使用的解决方法是在 进程,然后使用

autostart=false
创建引导脚本并
autostart=true
(一次性)。引导程序可以是 shell 脚本 每个进程都会调用
autorestart=false
supervisorctl start
将阻塞,直到进程成功启动。

    


0
投票

https://github.com/bendikro/supervisord-dependent-startup

© www.soinside.com 2019 - 2024. All rights reserved.