スクリプト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が既に実行されており、スクリプトrun-xyzxyz
が終了するため、強制終了して再起動しないでください。これにより、最終的に乗り越えてFATAL状態に達し、supervisord が監視しなくなります。start-retries
[program:xyz]
[program:xyz]
次の質問があります。
- 親プロセス ID が1で実行されているxyzが見つかった場合、シナリオでrun-xyzが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 がファイルに書き込まれます。