crontab定时任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了crontab定时任务相关的知识,希望对你有一定的参考价值。

参考技术A

Linux系统下提供了一个非常有用的定时任务命令crontab,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

文件格式:

看一个例子:

第1列:分钟0~59
第2列:小时0~23(0表示子夜)
第3列:日1~31
第4列:月1~12
第5列:星期0~7(0和7表示星期天)
第6列:要运行的命令

对于每一列,有如下格式:

所以上面的例子是每分钟将时间重写向到/tmp/cron.log文件中。

创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron在该文件中加入如下的内容:

在上面的例子中,系统将每隔1分钟向/tmp/cron.log写入一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数:

注: 最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的定时作业。

实例1:每1分钟执行一次cmd

实例2:每小时的第3和第15分钟执行

实例3:在上午8点到11点的第3和第15分钟执行

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

实例5:每周一上午8点到11点的第3和第15分钟执行

实例6:每晚的21:30执行

实例7:每月1、10、22日的4 : 45执行

实例8:每周六、周日的1 : 10执行

实例9:每天18 : 00至23 : 00之间每隔30分钟执行

实例10:每星期六的晚上11 : 00 pm执行

实例11:每一小时执行

实例12:晚上11点到早上7点之间,每隔一小时执行

Celery实现定时任务crontab


Celery实现定时任务crontab

一. 搭建celery定时任务架构
在项目中适合的位置新建一个定时任务目录celery_crontab,​​​在目录下创建config.py​​​,​​main.py​​,tasks.py三个文件,分别用于编写配置代码,定时任务实现代码,任务函数代码

# 目录结构
- celery_crontab
- config.py
- main.py
- tasks.py

二. 编写代码实现定时任务

  1. 在config.py中编写配置代码
from celery import Celery


# broker,rabbitmq
app = Celery(celery_crontab, broker=amqp://guest@localhost//)
# app = Celery(demo, broker=redis://127.0.0.1:6379/15)
  1. 在tasks.py中编写任务函数代码
from config import app


@app.task
def crontab_func1():
print(在此编写任务要实现的代码)


@app.task
def crontab_func2():
print(在此调用实现了定时任务功能的函数或方法)
  1. 在main.py中调用任务,并实现定时任务功能
from celery.schedules import crontab
from tasks import *


# 设置定时任务
app.conf.beat_schedule =
# 设置定时任务的参数,key可以自定义,见名知义,value为定时任务的相关参数的字典
contab_func1-every-1-minute:
# 指定要执行的任务函数
task: tasks.crontab_func1,
# 设置定时启动的频率,没分钟执行一次任务函数
schedule: crontab(minute=*/1),
# 传入任务函数的参数,可以是一个列表或元组,如果函数没参数则为空列表或空元组
args: []
,
contab_func2-every-day:
task: tasks.crontab_func2,
# 每周一至周五早上8点执行任务函数
schedule: crontab(minute=0, hour=8, day_of_week=[1, 2, 3, 4, 5]),
args: []
,



# 实现定时任务的另一种方式
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# sender.add_periodic_task(间隔时间秒, 任务名.s(参数), name=自定义任务名)
sender.add_periodic_task(10.0, crontab_func1.s(), name=crontab_func1 every 10)
sender.add_periodic_task(
# 每分钟执行一次
crontab(minute=*/1),
# .s()内传入任务函数需要的参数
crontab_func2.s()
)

在celery文档中例举了更多任务频率的设置方式,可以直接阅读文档
Celery documentation: ​​​http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html​​ 也可以按住Ctrl左键点击crontab,进入源码看__doc__(文档注释)内容,里面也例举了很多方法

三. 启动定时任务
启动定时任务应在main.py的位置,所以最好到main.py所在目录下执行命令,在其他位置启动时要指定main的路径


使用multi方式启动定时任务,celery会自动生成任务子节点和自动创建子进程
work为执行任务的进程名字
-A main 指定定时任务的启动函数main
-l info 指定日志等级为info
-B 将celery定时任务设置为后台守护进程,不占用终端
--logfile=celerylog.log 指定日志保存的文件名.也可指定路径加文件名

celery multi start work -A main -l info -B --logfile=celerylog.log
# 停止定时任务时,将start换成stop
celery multi stop work -A main -l info -B --logfile=celerylog.log
# 重启定时任务,将start换成restart
celery multi restart work -A main -l info -B --logfile=celerylog.log

Celery的使用场景非常多,不管是实现异步任务,还是实现定时任务,基本都会依赖命令来启动和停止任务,所以Celery的命令是非常多的,了解更多celery的命令可以到文档里查看

Celery documentation: ​​http://docs.celeryproject.org/en/latest/reference/celery.bin.celery.html​​ 也可以在终端输入 celery -h 查看帮助信息

Windows Bug:RuntimeError: This platform does not support detach.

site-packages\\celery\\platforms.py中尝试导入模块 “resource”时失败,这个模块不支持Windows,所以定时任务应该部署在Linux系统上.

Celery实现定时任务crontab_celery定时任务架构


以上是关于crontab定时任务的主要内容,如果未能解决你的问题,请参考以下文章

linux定时任务(crontab)

Crontab定时任务

centos7 ubuntu crontab定时任务

Celery实现定时任务crontab

定时任务小结

Linux定时任务-crontab