私は単純なプログラム構成でスーパーバイザーをテストしています:
[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
私は、supervisordを停止するまで、supervisorがプログラムを再起動し続けることを望みます。
出来ますか?はいの場合、それを行う方法は?
スーパーバイザにタイムスタンプ付きのstdout
を記録させるオプションはありますか、またはstdout
自体にタイムスタンプを配置する必要がありますか?
Dockerマイクロサービス環境で作業しているときに同じ使用例が発生しました。私の場合、動的に生成された構成が設定される前にNginxが起動した可能性がありました。
現在のところ、プロセスが正常に開始するまで、Supervisordにサービスを無限に再開させる方法はありません。
ただし、startretries
オプションを使用することで実現可能な回避策があります。 startretries
オプションを使用すると、Supervisordは指定された回数、またはプロセスが正常に開始されるまで再起動します。
私の特定の使用例では、競合状態の時間枠は1秒未満だったので、startretries=2
で十分でした。ただし、必要に応じて、はるかに高い値に設定できます。
[program:test]
startretries=10
実際にはより良い方法は、開始されたプログラムに優先順位を割り当てることです
[program:x]
priority=1
[program:y]
priority=2
数字が小さいほど起動順序が高く、もちろん再試行の回数が多いことを示しています。