uWSGI类cron接口
uWSGI的 master 拥有一个内部类cron的工具,它可以在预设的时间生成事件。你可以这样用它
- 通过uWSGI API,在这种情况下,cron事件将会生成uWSGI信号
- 直接通过选项,在这种情况下,事件将会运行shell命令
基于uWSGI信号
uwsgi.add_cron()
函数是uWSGI信号cron工具的接口。语法如下
- uwsgi.add_cron(signal, minute, hour, day, month, weekday)
后面5个参数与标准的crontab工作原理相似,但是用-1代替”*”,用-2,-3等代替”/2”, “/3”等。
- import uwsgi
- def five_o_clock_on_the_first_day_of_the_month(signum):
- print "It's 5 o'clock of the first day of the month."
- uwsgi.register_signal(99, "", five_o_clock_on_the_first_day_of_the_month)
- uwsgi.add_cron(99, 0, 5, 1, -1, -1)
定时器 VS. cron
没有设置到指定日期的周期性事件应该使用定时器/红黑定时器。但你对指定日期/小时感兴趣的时候,使用cron。
例如:
- uwsgi.add_cron(99, -1, -1, -1, -1, -1) # ugly, bad and inefficient way to run signal 99 every minute :(
- uwsgi.add_timer(99, 60) # much better.
注意
day
和weekday
像原始crontab那样进行或运算。- 默认情况下,你可以为每个master最多定义64个基于信号的cron任务。可以在
uwsgi.h
中增加这个值。
基于选项的cron
你可以使用 cron
选项,在配置中直接定义cron任务。可以指定无数个基于选项的cron记录。语法与基于信号的cron相同。
例如:
- [uwsgi]
- cron = 59 2 -1 -1 -1 /usr/bin/backup_my_home --recursive
- cron = 9 11 -1 -1 2 /opt/dem/bin/send_reminders
- <uwsgi>
- <cron>59 2 -1 -1 -1 /usr/bin/backup_my_home --recursive</cron>
- <cron>9 11 -1 -1 2 /opt/dem/bin/send_reminders</cron>
- </uwsgi>
- [uwsgi]
- ; every two hours
- cron = -1 -2 -1 -1 -1 /usr/bin/backup_my_home --recursive
Legion cron
当你的实例是 uWSGI Legion子系统 的一部分时,你可以配置它只在它是指定Legion的Lord时才运行cron。
- [uwsgi]
- legion = mycluster 225.1.1.1:1717 100 bf-cbc:hello
- legion-node = mycluster 225.1.1.1:1717
- ; every two hours
- legion-cron = mycluster -1 -2 -1 -1 -1 /usr/bin/backup_my_home --recursive
Unique crons
注解
这个特性自1.9.11起可用。
一些命令可能需要较长的时间来完成,或者只是挂在那里执行它们的任务。有时,这没问题,但还是有一些情况,运行相同命令的多个实例可能是危险的。
对于这种情况,增加了 unique-cron
和 unique-legion-cron
选项。语法与 cron
和 legion-cron
相同,但是不同在于,uWSGI将会跟踪执行状态,并且在它完成之前,并不会再次执行cronjob。
例子:
- [uwsgi]
- cron = -1 -1 -1 -1 -1 sleep 70
这会在每分钟执行 sleep 70
,但是sleep命令将会比我们的执行时间间隔还要长,最后,将会得到一个数目增长的sleep进程。要修复这个问题,我们可以简单的用 unique-cron
替换 cron
,uWSGI会确保只有一个sleep进程在运行。一个新的进程会在前一个结束的时候立即启动。
Harakiri
注解
自1.9.11起可用。
—cron-harakiri
将会强制命令执行的时间。如果有命令花费更长的时间,那么将会杀死这个命令。
- [uwsgi]
- cron = sleep 30
- cron-harakiri = 10
这会在10秒后杀死cron命令。注意, cron-harakiri
是全局限制,它影响的是所有的cron命令。要设置一个用单一命令上的限制,使用 cron2
选项 (见下)。
cron选项的新语法
注解
自1.9.11起可用
为了对cron更好的控制,一个新的选项被添加到uWSGI:
- [uwsgi]
- cron2 = option1=value,option2=value command to execute
例子:
- [uwsgi]
- cron2 = minute=-2,unique=1 sleep 130
将会每2分钟生成一个唯一的cron命令 sleep 130
。
选项列表是可选的,每个cron可用的选项如下:
minute
- crontab的分钟部分,默认是-1 (解析为*)hour
- crontab的小时部分,默认是-1 (解析为*)day
- crontab的天部分,默认是-1 (解析为*)month
- crontab的月部分,默认是-1 (解析为*)week
- crontab的周部分,默认是-1 (解析为*)unique
- 将cron命令标记为唯一 (见上),默认是0 (不唯一)harakiri
- 为该cron命令设置harakiri超时时间 (以秒为单位),默认是0 (不使用harakiri)legion
- 为这个cron命令设置使用的legion名,cron legion只有在legion lord节点上才会执行。
注意,你不能在选项列表中使用空格。(minute=1, hour=2
将不会工作,但是 minute=1,hour=2
则是可以的。)如果缺失了任何选项,那么就会使用默认值。
- [uwsgi]
- # execute ``my command`` every minute (-1 -1 -1 -1 -1 crontab).
- cron2 = my command
- # execute unique command ``/usr/local/bin/backup.sh`` at 5:30 every day.
- cron2 = minute=30,hour=5,unique=1 /usr/local/bin/backup.sh
- [uwsgi]
- legion = mycluster 225.1.1.1:1717 100 bf-cbc:hello
- legion-node = mycluster 225.1.1.1:1717
- cron2 = minute=-10,legion=mycluster my command
这会对 my command
禁用harakiri,但是其他的cron命令仍然会在10秒后被杀死:
- [uwsgi]
- cron-harakiri = 10
- cron2 = harakiri=0 my command
- cron2 = my second command