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が既に実行されており、スクリプトrun-xyzxyzが終了するため、強制終了して再起動しないでください。これにより、最終的に乗り越えてFATAL状態に達し、supervisord が監視しなくなります。start-retries[program:xyz][program:xyz]

次の質問があります。

  1. 親プロセス ID が1で実行されているxyzが見つかった場合、シナリオでrun-xyzが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