再起動を試みる前にX秒待機するようにスーパーバイザ管理プログラムを構成するにはどうすればよいですか?


9

一度に1つのRabbitMqメッセージを処理するワーカープロセスがあります。現在、ワーカーが終了するとすぐに、supervisordが再起動しています(次のメッセージが処理されます)。

X秒間隔を設定して、supervisordがすぐに再起動しないようにしますが、別のワーカーを開始する前に一定の時間待機します。

これは可能ですか?どうやって?

回答:


11

スーパーバイザプログラムセクションで間隔を指定する方法はありませんが、コードに "sleep()"を挿入して、プログラムがメッセージ処理の終了後に指定された時間待機するようにすることができます。

プログラムコードを変更したくない場合は、次のようにbashスクリプトにラップしてみてください。

#!/bin/bash
/usr/local/bin/myprogram
sleep 30

そして、プログラムではなく、そのスクリプトを実行するようにスーパーバイザープログラムセクションを変更します。

command=/usr/local/bin/myprogram.sh

/ usr / local / bin / myprogramが戻るまで、スリープは実行されませんか?
loostro 2014年

正確には、myprogramが終了した後にのみ、sleepがカウントを開始します。
Jakov Sosic 2014年

問題は、このスクリプトがシグナル、特にTERMを処理しないことです。
Torsten Bronger

9

cronが存在しないDockerコンテナー内からコマンドを実行する簡単な方法が必要でした。これが私が使っているものです:

[program:runevery]
directory = /my/workdir
command = sh -c "sleep 5;date >>/root/test.ts"
stdout_logfile = /var/log/supervisor/%(program_name)s.log
stderr_logfile = /var/log/supervisor/%(program_name)s.log
autorestart = true
startsecs = 0
exitcodes = 0,1,2

startsecs = 0は、スーパーバイザが数秒後に終了しても、コマンドが正常に開始されたと見なすことを保証します。そうしないと、スーパーバイザはループに入っていると考えて再起動を停止します。

上記の例で/root/date.tsに表示される内容は次のとおりです。

# tail -f /root/test.ts 
Tue Nov 17 20:42:58 UTC 2015
Tue Nov 17 20:43:04 UTC 2015
Tue Nov 17 20:43:10 UTC 2015
[...]

スリープを好みに合わせて調整し、「date >> / root / test.ts」を必要なものに置き換えます。

このソリューションは、毎分よりも頻繁にcronjobを実行する必要がある場合にも便利です。


+1は賢いソリューションです。似たようなことをしたいです。残念ながら、RPC呼び出しを使用してリスナーで終了コードを取得する必要があるため、これは私にとっては機能しません。残念ながら、スーパーバイザーは終了直後にプログラムを再起動し、コードを0にします。
Onema 2016

0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

その後

supervisorctl -c your_config_file reload

1. execコマンドを使用する必要があります。それ以外の場合は、サブsleep 60 && exec your command進行状況が分岐し、進行状況は次のようになります。

$ ps -ef|grep urcmd
work      1818  1698  0 17:35 ?        00:00:00 bash -c sleep 60 && urcmd
work      3872  1818  0 17:36 ?        00:00:00 urcmd

を使用supervisorctlしてurAppを停止すると、1818の進行状況が停止し、3872が孤立した進行状況になります。

2. startsecsをsleep secsの5倍に変更することをお勧めします。このアプリを起動してステータスを確認すると、開始していることが表示されます。

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          STARTING  
otherapp                       RUNNING   pid 13502, uptime 0:00:55

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          RUNNING   pid 13503, uptime 0:00:05
otherapp                       RUNNING   pid 13502, uptime 0:00:65

それ以外の場合、sleep secs未満の値を設定すると、アプリを起動してステータスを確認すると、実行中のステータスが表示されますが、実際に実行する前にまだcmdをスリープしています

3.設定ファイルを変更するときは、reload cmdを使用するか、supervisordを再起動して機能させる必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.