回答:
スーパーバイザプログラムセクションで間隔を指定する方法はありませんが、コードに "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を再起動して機能させる必要があります。