如何configurationsupervisordpipe理的程序在尝试重新启动之前等待X秒?

我有一个工作进程一次处理1个RabbitMq消息。 现在,一旦工人退出,supervisord正在重新启动它(将处理下一条消息)。

我想设置一个时间间隔X秒,这样supervisord不会立即重新启动,但是在启动另一个工作人员之前它会等待一段时间。

这可能吗? 怎么样?

在supervisor程序部分中没有办法指定间隔,但是你可以做的就是把“sleep()”放到你的代码中,以便程序在完成消息处理后等待指定的时间。

如果你不想/不能改变程序代码,你可以尝试把它包装到bash脚本中,例如:

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

并改变你的主pipe程序部分运行该脚本,而不是你的程序:

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

我需要一个简单的方法来从Docker容器中运行一个没有cron的命令。 这是我正在使用的:

 [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确保pipe理员认为命令即使在几秒钟后退出也能成功启动。 否则,主pipe将停止重新启动,认为它在一个循环中。

下面是你会看到在/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 [...] 

根据自己的喜好调整睡眠时间,并用你需要的任何东西replace“date >> / root / test.ts”。

如果您需要比每分钟更频繁地运行cronjob,则此解决scheme也非常方便。

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

接着

 supervisorctl -c your_config_file reload 

1.你需要使用exec命令,否则它会从sleep 60 && exec your command进程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.build议将startsecs更改为比睡眠秒多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 

否则,如果您设置的值小于睡眠秒数,当您启动应用程序并检查状态时,您将获得运行状态,但在实际执行之前仍处于睡眠状态

3.当你改变你的configuration文件时,你需要使用reload cmd或者重新启动supervisord来使其工作