作者:叶孤心丶
转载 链接:https://blog.csdn.net/yeguxin/article/details/79543514
有时候需要让系统定时执行一些比较简单的函数,那么就可以借用linux自带的crontab即可实现。
1.crontab简介
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
2.确定服务器是否开启定时任务计划服务
[root@docker /]# service crond status
Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-04-21 04:21:05 EDT; 3min 9s ago
Main PID: 22089 (crond)
Tasks: 1
Memory: 688.0K
CGroup: /system.slice/crond.service
└─22089 /usr/sbin/crond -n
Apr 21 04:21:05 docker systemd[1]: Started Command Scheduler.
Apr 21 04:21:05 docker crond[22089]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 31% if used.)
Apr 21 04:21:06 docker crond[22089]: (CRON) INFO (running with inotify support)
Apr 21 04:21:06 docker crond[22089]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Apr 21 04:24:01 docker crond[22089]: (root) RELOAD (/var/spool/cron/root)
命令: service crond start 开启服务
命令: service crond stop 关闭服务
命令: service crond restart 重启服务
命令: service crond reload 重新载入配置
3.crontab格式说明
格式为 : * * * * *
示例:
*/1 * * * * Command 每f分钟执行
0 */1 * * * Command 每小时执行
5 * * * * Command 每小时的第5分钟执行一次命令
30 18 * * * Command 指定每天下午的 6:30 执行一次命令
30 7 8 * * Command 指定每月8号的7:30分执行一次命令
30 5 8 6 * Command 指定每年的6月8日5:30执行一次命令
30 6 * * 0 Command 指定每星期日的6:30执行一次命令
每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。
5,15,25,35,45,55 16,17,18 * * * Command
4.实例
crontab -e 编辑某个用户的cron服务
crontab -l 列出某个用户cron服务的详细内容
实际需求:test.py文件里有两个函数 A和B,linux定时任务想分别执行这个py文件中的a和b函数,每小时执行a函数,每天10点执行b函数。
那么我们可以把a,b函数分别置于两个不同的sh文件放入定时任务即可。
test.py:
import os
from datetime import datetime
def a():
with open('a.txt', 'a') as f:
f.write(datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
f.close()
def b():
with open('b.txt', 'a') as f:
f.write(datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
f.close()
a.sh:
#!/usr/bin/bash
cd /home # 用于切换至指定路径
python -c 'import test;test.a()'
b.sh:
#!/usr/bin/bash
cd /home # 用于切换至指定路径
python -c 'import test;test.b()'
开始配置定时任务:
[root@docker home]# crontab -e
0 */1 * * * /bin/sh /home/a.sh # 每小时执行
0 10 * * * /bin/sh /home/b.sh # 每天十点执行
填写好保存退出(:wq),接着就是重启定时任务:
service crond restart
主要它的用法也非常简单,给人一看就明白的感觉,下面是它的标准格式:
minute hour day month week command 顺序:分 时 日 月 周
其中:
- minute:表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
简单说明一下crontab,它是linux系统的定时任务命令,与windows系统下的计划任务有点类似,我们的使用方法也很简单,首先使用你当前的用户创建一个crontab文件,使用crontab -e命令创建一个文件,这个文件在这个目录下:
/var/spool/cron
使用 cd /var/spool/cron就可以切换到该目录下,文件名是以当前用户名命名的,比如你当前是root权限账户,那你创建的文件可能就是root,如果你是test用户,那么文件名就是test,切记,所有用户定义的crontab文件都被保存在/var/spool/cron目录中,之后编辑该文件,使用vim root或vim test编辑文件。下面给大家看实例:
每分钟执行一次command
* * * * * command
每小时的第3和第15分钟执行
3,15 * * * * command
在上午的8点到11点的第3和第15分钟执行
3,15 8-11 * * * command
在每天的23点30分执行备份文件脚本,并同时输出执行错误日志到log文件
30 23 * * * python /home/***/***/test.py >> /home/***/***/test.log 2>&1
每个星期一的上午8点15分执行
15 8 * * 1 command
注意设置时间要大于当前时间1分钟才可能看到效果,不然你本地时间如果和linux系统时间不一致就可能会看不到效果
附加
crontab设置定时执行需要进入虚拟环境执行程序shell脚本:
#!/bin/sh
export PATH=$PATH:/usr/local/bin
echo -n "开始采集代理 "
source /home/www/XXX/venv/bin/activate
python /home/www/XXXX/app/XXXX.py >> /home/www/XXX/XXX.log