使用supervisor作为CRON

问题描述 投票:0回答:5

有没有办法配置supervisor每X秒运行一些命令(如CRON)?

我看到了事件侦听器和 TICK_ 事件的示例

[eventlistener:memmon]
command=memmon -a 200MB -m [email protected]
events=TICK_60

但它只运行该命令一次。

cron supervisord
5个回答
29
投票

为什么要发明轮子?您可以同时使用

cron
supervisord

在supervisord中,使用

autostart=false

创建任务

在 cron 中,使用

* * * * * supervisorctl start <taskname>
每分钟启动任务


27
投票

问题

正如您在 memmon 示例中看到的那样,supervisord 不会在每个事件中执行

memmon -a 200MB -m [email protected]
。相反,它启动此事件侦听器一次(或者如果您配置池,则可能启动几次),然后通过现有进程的标准输入发送每个新事件。

解决方案

因此,您确实需要为您想要在事件上触发的每种附加功能类型找到或编写一个与主管兼容的事件侦听器。

实施方法示例

设置配置并编写监听器

编写supervisord.cfg事件部分

[eventlistener:passthru]
command=/tmp/simple.py /bin/date -u +"%%s %%S:%%H:%%d:%%m"
events=TICK_60

(注意 - configParser 的 % 转义)

编写一个 simple.py 事件监听器

通过更改

文档中的示例侦听器来创建这个 simple.py 侦听器,以便它使用任何剩余参数执行其第一个参数:

#! /usr/bin/python import sys import subprocess def write_stdout(s): sys.stdout.write(s) sys.stdout.flush() def write_stderr(s): sys.stderr.write(s) sys.stderr.flush() def main(args): while 1: write_stdout('READY\n') # transition from ACKNOWLEDGED to READY line = sys.stdin.readline() # read header line from stdin write_stderr(line) # print it out to stderr headers = dict([ x.split(':') for x in line.split() ]) data = sys.stdin.read(int(headers['len'])) # read the event payload res = subprocess.call(args, stdout=sys.stderr); # don't mess with real stdout write_stderr(data) write_stdout('RESULT 2\nOK') # transition from READY to ACKNOWLEDGED if __name__ == '__main__': main(sys.argv[1:]) import sys

确保主管配置有效

$ supervisorctl [-c cfg] supervisor> status passthru RUNNING pid 4471, uptime 0:00:32 supervisor> tail passthru OKREADY RESULT 2 OKREADY ... supervisor> tail passthru stderr supervisor> tail passthru stderr ver:3.0 server:supervisor serial:0 pool:passthru poolserial:0 eventname:TICK_60 len:15 1451411161 01:17:29:12 <--- output when:1451411160ver:3.0 server:supervisor serial:1 pool:passthru poolserial:1 eventname:TICK_60 len:15 1451411220 00:17:29:12 <--- output when:1451411220

现在date -u +"%s %S:%H:%d:%m"

每 60 秒运行一次。

交换所需的命令

创建可执行脚本

/tmp/hiworld.php:

#! /usr/bin/php <?= "hiya\n";

(chmod + x ...)

更改supervisord.cfg中监听器的参数

[eventlistener:passthru] command=/tmp/simple.py /tmp/hiworld.php ;stdout_logfile=/tmp/passthru events=TICK_60 ;autorestart=true ;startsecs=0

重新加载supervisord并测试 (重读似乎没有发现这个变化)

supervisor> reload Really restart the remote supervisord process y/N? y Restarted supervisord supervisor> status passthru RUNNING pid 6017, uptime 0:00:10 supervisor> tail passthru stderr supervisor> status passthru RUNNING pid 6017, uptime 0:00:21 supervisor> status passthru RUNNING pid 6017, uptime 0:01:01 supervisor> tail passthru stderr ver:3.0 server:supervisor serial:316 pool:passthru poolserial:0 eventname:TICK_60 len:15 hiya when:1418926740 supervisor>

结束

现在所需的命令每 60 秒运行一次。 您现在已阅读如何调整权限、位置、日志等的详细信息。


21
投票
Supervisor 不容易支持这一点。

但是为了实现你的目标,你可以使用supervisor来启动cron(例如,对于docker容器):

https://gist.github.com/martinrusev/7015e393d46647dbad15

在 Docker 中安装

cron

apt-get install cron
 使用类似 debian 的 docker)

在主管配置中:

[program:cron] command=cron -f -L 15 autostart=true autorestart=true

-f

是前台,
-L 15
是所有cron日志输出。

然后使用用户 crontab、全局

/etc/crontab

 或任何 crontab 特殊目录(
/etc/cron.hourly
/etc/cron.daily
、...)


14
投票
可以调用bash

sleep

命令:

[program:mycmd] command=bash -c 'sleep 300 && exec <your command here>' autorestart=true
这将每 5 分钟运行一次您的命令。不要忘记 

exec

 部分,用您的命令替换 bash 进程,以便主管获得正确的退出代码。


2
投票
您可以使用 crontab 来管理和安排您的主管程序。

使用命令

supervisorctl start <program_name>


注意:这将仅启动管理程序的单个实例。如果它已经在运行并且 crontab 尝试再次触发它,supervisorctl start

命令将不会启动新实例。

© www.soinside.com 2019 - 2024. All rights reserved.