2019独角兽企业重金招聘Python工程师标准>>>
在日常的开发中,crontab(时程表)应该是最常用的指令之一,下面我们来看看百度百科的解释:
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
简而言之, 当我们有一些需要周期性被调用的指令或脚本。比如每天凌晨需要调用一个脚本去更新某些数据,每分钟要调个脚本检测一些数据等等之类的。
crontab命令(用来管理我们整个时程表的命令,一个时程表下可以有多个调度任务)的语法如下:
crontab [-u user] [ -e | -l | -r ]
crontab [-u user] file
参数的解释:
crontab file:根据file的内容来设定时程表
-e: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI
-r: 删除目前的时程表
-l: 列出目前的时程表
-u [user]:默认就是操作当前用户的时程表,
如果你拥有编辑其他用户时程表的权限(比如你是root用户),
那么加上这个参数,就表示操作该用户的时程表
如加上-u admin,表示操作admin用户的时程表
crontab命令的例子:
列出leo这个用户的crontab文件:
$ crontab -u leo -l
使用编辑器打开crontab文件的条目,对其进行编辑(如果想停用某个调度任务,又不想直接将其删除,可以在前面加上#注释):
$ crontab -e
删除crontab文件:
$ crontab -r
如果已经有了自己编辑的crontab文件,想直接导入到crontab中:
$ crontab
下面我们来创建自己的一个任务调度(通过-e命令):
crontab -e
然后进入到了vi编辑页面,可以编辑我们的调度任务,具体的格式如下:
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
f1 f2 f3 f4 f5 command
最后一行即我们的格式,其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,以此类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,以此类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,以此类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,以此类推
下面通过一些例子来帮助理解:
0 * * * * python /home/a.py //每月每天每小时的第0分钟执行一次 python /home/a.py命令
*/20 6-12 * 12 * /usr/bin/backup //在12月内,每天的早上6点到12点中,每隔20分钟执行一次/usr/bin/backup
0 17 * * 1-5 echo "hi" //周一到周五每天下午5点,执行echo "hi"命令
20 0-23/2 * * * echo "haha" //每月每天的0点-23点,每隔2小时的第20分钟,执行 echo "haha"命令
0 23-7/2,8 * * * date //晚上11点到早上7点之间每隔两个小时还有早上8点,执行date命令
43 21 * * * /usr/bin/backup //每天的21:43 执行/usr/bin/backup
0 9 * * 1 echo "what a day" //每周一的早上9点执行 ehco "what a day"
0,10 17 * * 0,2,3 /home/b.sh //每周日,周二,周三的下午5点和下午5点10分执行/home/b.sh
0-10 17 1 * * /home/c.sh //毎月1日从17:00到17:10,毎隔1分钟,执行/home/c.sh
42 4 1 * * /home/back.sh //毎月1日的 4:42分 执行/home/back.sh
0 18 * * 1-6 echo "haha" //周一到周六下午6点执行echo "haha"
0,10,20,30,40,50 * * * * echo "en..." //每隔10分 执行echo "en..."
*/10 * * * * echo "en..." //每隔10分 执行echo "en..."
以上主要侧重反映前5个时间参数的不同,下面列一些command参数的一些主意事项:
1.当运行的命令有输出,而你又不想让它输出时,可以将其重定向到空文件:
1 * * * * python /home/a.py >/dev/null 2>&1
2.同理,也可以把输出重定向自定义日志中去,方便后期检查:
1 * * * * python /home/a.py > /home/log/a.log 2>&1
3.当脚本频繁被调用时,想要按时间来创建日志文件时,可以加上date参数(%前要加上\):
0 1 * * * python /home/e.py >> /data2/log/dlog.`date +\%Y\%m\%d`
以上~