一度に1つのRabbitMqメッセージを処理するワーカープロセスがあります。現在、ワーカーが終了するとすぐに、supervisordが再起動しています(次のメッセージが処理されます)。
X秒間隔を設定して、supervisordがすぐに再起動しないようにしたいのですが、別のワーカーを開始する前に一定の時間待機します。
これは可能ですか?どうやって?
スーパーバイザプログラムセクションで間隔を指定する方法はありませんが、コードに "sleep()"を配置して、プログラムがメッセージ処理の終了後に指定された時間待機するようにすることができます。
プログラムコードを変更したくない場合は、次のようにbashスクリプトにラップしてみてください。
#!/bin/bash
/usr/local/bin/myprogram
sleep 30
そして、プログラムではなく、そのスクリプトを実行するようにスーパーバイザープログラムセクションを変更します。
command=/usr/local/bin/myprogram.sh
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を実行する必要がある場合にも便利です。
[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を再起動して機能させる必要があります。