我们有一个由脚本run-xyz 启动的服务 xyz [这个脚本在启动服务xyz之前有一堆预激活步骤]
我的目标是监视进程xyz,因此我们使用具有以下配置的 supervisord:
[program:xyz]
command = /path/to/run-xyz
numprocs = 1
priority = 100
startsecs = 10
startretries = 10
stopwaitsecs = 60
exitcodes = 0
autostart = false
autorestart = true
redirect_stderr = true
stdout_logfile = /path/to/log
脚本run-xyz启动服务xyz并有一个无限循环检查进程xyz是否存在。[例如,在xyz的进程 id 的SIGKILL上,它退出了无限循环,脚本停止运行,supervisord 自动重启,之后一切恢复正常][program:xyz]
但是,如果run-xyz进程以某种方式被杀死,那么xyz服务将成为一个孤儿,其父进程 id 为1。Supervisord 重新启动[program:xyz]
,但xyz
不应被杀死并重新启动,因为xyz已经在运行并且脚本run-xyz退出,这最终导致start-retries
越过并[program:xyz]
达到FATAL状态,现在 supervisord 不再监控[program:xyz]
。
我有以下问题:
- 当run-xyz发现xyz以父进程 id 为1运行时,是否有办法将自己附加为xyz的父进程 id ?
- supervisord 可以监控xyz pid 并在xyz pid 不再存在
[program:xyz]
时重新启动。我们不关心run-xyz是否正在运行,因为它唯一的工作就是启动xyz。【试过pidproxy路由还是不行,下面会解释】 - 对于我们正在努力实现的目标,supervisord 是正确的选择吗?
使用pidproxy,配置变为:
[program:xyz]
command = /path/to/pidproxy /path/to/xyz.pid /path/to/run-xyz
numprocs = 1
priority = 100
startsecs = 0
startretries = 10
stopwaitsecs = 60
exitcodes = 0
autostart = false
autorestart = true
redirect_stderr = true
stdout_logfile = /path/to/log
使用上述配置时,我们删除了run-xyz中的无限循环,其中它启动xyz,休眠几秒钟(30)并退出。但是主管没有等待,它假设run-xyz已经退出并再次尝试生成,这种情况会发生,直到重试结束它达到FATAL状态。注意:/path/to/xyz.pid
存在并且 pid 被写入文件中。