我有一个工作进程,每次处理 1 条 RabbitMq 消息。现在,一旦工作进程退出,supervisord 就会重新启动它(它将处理下一条消息)。
我想设置一个间隔 X 秒,以便 Supervisord 不会立即重新启动,而是等待一段时间再启动另一个工作程序。
这可能吗? 怎么做?
答案1
在主管程序部分没有办法指定间隔,但您可以将“sleep()”放入代码中,以便程序在完成消息处理后等待指定的时间。
如果您不想/不能更改程序代码,您可以尝试将其包装到 bash 脚本中,例如:
#!/bin/bash
/usr/local/bin/myprogram
sleep 30
并修改你的主管程序部分来运行该脚本,而不是你的程序:
command=/usr/local/bin/myprogram.sh
答案2
我需要一种简单的方法来从没有 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 确保即使命令在几秒后退出,supervisor 也会认为命令已成功启动。否则,supervisor 将停止重新启动它,认为它处于循环中。
使用上面的示例,您将在 /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,此解决方案也很方便。
答案3
[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.建议将启动秒数改为比睡眠秒数多 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.当你更改配置文件时,你需要使用重新加载cmd或重新启动supervisord才能使其工作