0

我们有一个由脚本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]

我有以下问题:

  1. 当run-xyz发现xyz以父进程 id 为1运行时,是否有办法将自己附加为xyz的父进程 id ?
  2. supervisord 可以监控xyz pid 并在xyz pid 不再存在[program:xyz]时重新启动。我们不关心run-xyz是否正在运行,因为它唯一的工作就是启动xyz。【试过pidproxy路由还是不行,下面会解释】
  3. 对于我们正在努力实现的目标,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 被写入文件中。

4

0 回答 0