如何配置Supervisord:子进程故障不重启且主进程随子进程终止?
配置Supervisord实现子进程失败不重启且主进程随子进程停止而退出
嘿,这个需求其实可以通过Supervisord的核心配置参数加上简单的事件监听器来实现,我来给你一步步拆解:
1. 配置子进程失败不自动重启
在每个被托管的子进程配置块([program:xxx])中,添加以下两个关键参数:
[program:your-process-name] command=/path/to/your/executable # 核心配置:无论进程正常退出还是异常崩溃,都不重启 autorestart=false # 启动失败后直接放弃,不重复重试(可选但更严谨) startretries=0
autorestart=false:这个参数明确告诉Supervisord,不管子进程以什么状态退出,都不要尝试自动重启它。startretries=0:如果子进程第一次启动就失败(比如执行文件不存在、权限不足),Supervisord不会反复重试启动,直接终止该进程的托管。
2. 配置主进程随任一子进程停止/崩溃而退出
Supervisord本身没有直接的配置项实现这个逻辑,但可以通过事件监听器来监听子进程的状态变化,一旦检测到子进程停止或崩溃,就触发主进程关闭。
步骤2.1:创建事件监听器脚本
写一个简单的Python脚本(也可以用Shell脚本),用来监听子进程的停止/崩溃事件,然后执行关闭命令。比如创建shutdown_on_process_exit.py:
#!/usr/bin/env python import sys import os def listen_for_events(): while True: # 读取Supervisord发送的事件头 header_line = sys.stdin.readline() if not header_line: break # 输入流关闭,退出循环 # 解析事件头的键值对信息 headers = dict(item.split(':') for item in header_line.strip().split()) # 根据头信息读取事件体内容 event_body = sys.stdin.read(int(headers['len'])) # 监听目标事件:子进程正常停止、子进程崩溃 if headers['eventname'] in ('PROCESS_STATE_STOPPED', 'PROCESS_STATE_FATAL'): # 触发Supervisord主进程关闭 os.system('supervisorctl shutdown') break if __name__ == '__main__': listen_for_events()
给脚本添加执行权限:
chmod +x /path/to/shutdown_on_process_exit.py
步骤2.2:在Supervisord中配置事件监听器
在你的Supervisord主配置文件(通常是/etc/supervisord.conf或/etc/supervisor/supervisord.conf)中,添加监听器的配置块:
[eventlistener:shutdown-trigger] # 指定刚才创建的脚本路径 command=/path/to/shutdown_on_process_exit.py # 监听的事件类型:子进程停止、子进程崩溃 events=PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL # 监听器本身退出后不重启 autorestart=false
3. 验证配置
重启Supervisord使配置生效:
supervisorctl reload
现在可以做两个测试:
- 手动停止某个子进程:
supervisorctl stop your-process-name,此时Supervisord主进程会随之退出。 - 让某个子进程崩溃(比如用
kill命令杀死进程),Supervisord会检测到事件并自动退出。
这样就完全满足你的需求啦!
内容的提问来源于stack exchange,提问作者rokpoto.com
相关产品推荐
相关产品推荐

