如何解决主管中的“进入严重状态,启动重试次数过多,速度过快”的问题

如何解决主管中的“进入严重状态,启动重试次数过多,速度过快”的问题

我只是用简单的程序配置测试我的主管:

[program:test]
command=python -c "print 'hello'"
autostart=true                
autorestart=true
exitcodes=1
user=ratdon
stdout_logfile=/opt/log/test.log
stderr_logfile=/opt/log/test.log

以 身份启动我的监督员sudo supervisord -n -c /opt/supervisord.conf &。但经过几次生成后,它又停止生成它。

2016-02-01 11:17:58,973 CRIT Supervisor running as root (no user in config file)
2016-02-01 11:17:58,973 WARN Included extra file "/opt/test.ini" during parsing
2016-02-01 11:17:58,994 INFO RPC interface 'supervisor' initialized
2016-02-01 11:17:58,994 CRIT Server 'inet_http_server' running without any HTTP authentication checking
2016-02-01 11:17:58,995 INFO supervisord started with pid 19644
2016-02-01 11:17:59,998 INFO spawned: 'test' with pid 19648
2016-02-01 11:18:00,026 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:01,030 INFO spawned: 'test' with pid 19650
2016-02-01 11:18:01,064 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:03,072 INFO spawned: 'test' with pid 19653
2016-02-01 11:18:03,104 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:06,108 INFO spawned: 'test' with pid 19657
2016-02-01 11:18:06,138 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:07,139 INFO gave up: test entered FATAL state, too many start retries too quickly

我希望supervisor 不断重启该程序直到我停止supervisord。

有可能吗?如果可以,该怎么做?

是否有任何选项可以让主管记录stdout带有时间戳的内容,或者我们需要将时间戳放在stdout其本身中?

答案1

我在 Docker 微服务环境中工作时遇到了同样的用例。在我的案例中,Nginx 有可能在其动态生成的配置到位之前就启动了。

目前,没有办法让 Supervisord 无限地重启服务,直到进程启动成功。

但是,使用选项可以实现一个可行的解决方法startretries。使用选项后startretries,Supervisord 将重新启动指定的次数,或者直到进程成功启动。

在我的特定用例中,竞争条件的时间范围小于一秒,因此设置startretries=2就足够了。但是,如果需要,您可以将其设置为更高的值。

[program:test]
startretries=10

答案2

其实更好的方法是给启动的程序分配优先级

[program:x]
priority=1
[program:y]
priority=2    

请注意,数字越低表示启动顺序越高,当然也包括较高的重试次数

相关内容