linux添加定时任务之crontab

1 背景

在linux下,如果想要在未来的某个时刻执行某个任务,并且在未来的每一个这样的时刻里都要执行这个任务。举个简单的例子,比如说想要在将来,每天的十二点都重启路由器,大多数发行版都自带一个守护进程(daemon)cron来完成这项工作。

2 linux下常用定时任务工具

2.1 cron

cron是大多数linux发行版都自带的守护进程(daemon),用来重复运行某些被设定好了确定的运行时间的任务,这些任务可以是每个月运行、每周运行、每天运行,甚至是每一分钟运行。用cron执行的任务适合于24小时运行的机器,cron执行的任务会在设定好的时刻执行,当机器处于关机状态下并错过了任务执行的时间,cron任务就无法预期执行了

2.2 crontab

crontab是cron table的简称,crontab既可以指cron用来定期执行特定任务所需要的列表文件,又可以指用来创建、删除、查看当前用户(或者指定用户)的crontab文件的命令。

2.3 anacron

anacron不是守护进程,可以看做是cron守护进程的某种补充程序,anacron是独立的linux程序,被cron守护进程或者其他开机脚本启动运行,可以每天、每周、每个月周期性地执行一项任务(最小单位为天)。

适合于可能经常会关机的机器,当机器重新开机anacron程序启动之后,anacron会检查anacron任务是否在合适的周期执行了,如果未执行则在anacron设定好的延迟时间之后只执行一次任务,而不管任务错过了几次周期。

举个例子,比如你设定了一个每周备份文件的任务,但是你的电脑因为你外出度假而处于关机状态四周,当你回到家中开机后,anacron会在延迟一定时间之后只备份一次文件。由于发行版的不同,cron守护进程如何运行anacron会有所不同。

3 crontab详解

3.1 crontab简述

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

3.2 crontab命令格式

crontab [-u user] file
crontab [-u user] [-l | -r | -e][-i]
参数说明
-u user用来设定某个用户的crontab服务
filefile是命令文件的名字,表示将file做为crontab的任务列表文件并载入
crontab如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab
-e编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件
-l显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容
-r从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件
-i在删除用户的crontab文件时给确认提示
 1 [root@calc ~]# crontab -help
 2 crontab:无效选项 -- h
 3 crontab: usage error: unrecognized option
 4 Usage:
 5  crontab [options] file
 6  crontab [options]
 7  crontab -n [hostname]
 8 
 9 Options:
10  -u <user>  define user
11  -e         edit user's crontab
12  -l         list user's crontab
13  -r         delete user's crontab
14  -i         prompt before deleting
15  -n <host>  set host in cluster to run users' crontabs
16  -c         get host in cluster to run users' crontabs
17  -s         selinux context
18  -x <mask>  enable debugging
19 
20 Default operation is replace, per 1003.2

举几个例子:

  • 创建并编辑当前用户的crontab
crontab -e
  • 列出当前用户的crontab
crontab -l
  • 删除用户l user01 的crontab
crontab -u user01 -i -r

3.3 crontab文件格式

当用 crontab -e 编辑当前用户的crontab文件时,首先写入以下内容。

 1 # crontab -e
 2 SHELL=/bin/bash
 3 MAILTO=root@example.com
 4 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 5 
 6 # For details see man 4 crontabs
 7 
 8 # Example of job definition:
 9 # .---------------- minute (0 - 59)
10 # | .------------- hour (0 - 23)
11 # | | .---------- day of month (1 - 31)
12 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
13 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
14 # | | | | |
15 # * * * * * user-name command to be executed

该文件的前三行代码设置了默认环境。cron守护进程并不提供任何环境。SHELL变量设置当cron任务(命令以及脚本)运行时的shell,MAILTO变量设置cron任务执行结果发送的邮箱,PATH设置去哪些目录下寻找cron任务的命令。

注释部分则解释一条cron任务的构成,一条cron任务就是一行,要设置多少条cron任务则写多少行。一条cron任务由七个部分组成,如下:

第一列第二列第三列第四列第五列第六列第七列
星期用户名要运行得到命令

看一个例子:

* * * * * echo `date` >> /tmp/cron.log

第1列:分钟0~59
第2列:小时0~23(0表示子夜)
第3列:日1~31
第4列:月1~12
第5列:星期0~7(0和7表示星期天)
第6列:要运行的命令
所以上面的例子是每分钟将时间重写向到/tmp/cron.log文件中。

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

格式说明示例
*对第一列来讲,表示每分钟执行命令,以此类推如: * * * * * cmd 表示每分钟执行命令cmd
a,b对第一列来讲,表示第a,b分钟执行命令,以此类推如:5,10 * * * * cmd 表示第5分钟和10分钟执行命令cmd
a-b对第一列来讲,表示第a到b分钟执行命令,以此类推如:5-10 * * * * cmd 表示每小时的5到10分钟执行命令cmd
*/n对第一列来讲,表示第隔n分钟执行命令,以此类推如:*/5 * * * * cmd表示每隔5分钟执行命令cmd

举几个例子:

  • 例子1:
# 每天凌晨执行
 0 0 * * * root command
  • 例子2:
# 每周星期天早上五点执行
0 5 * * sun root command

例子3:

# 每个月的前10天晚上10点开始每隔10分钟执行一次命令
*/10 22 1-10 * * root command
  • 例子4:
# 从星期一到五,每个小时的第10分钟、第20分钟以及第30分钟都执行一次命令
10,20,30 * * * 1-5 root command
  • 例子5:
# 从早上10点到晚上10点,每个偶数的小时(比如10点,12点)里每五分钟运行一次命令
*/5 10-22/2 * * * root command

特殊简便写法

1 @hourly 代表 0 * * * * ,每个小时运行一次
2 @daily 代表 0 0 * * * ,每天凌晨运行一次
3 @weekly 代表 0 0 * * 0 ,每周星期天凌晨运行一次
4 @monthly 代表 0 0 1 * * ,每个月第一天凌晨运行一次
5 @yearly 代表 0 0 1 1 * ,每年的头一分钟运行一次
6 @reboot 重启后执行一次

例子:

# 每天凌晨运行一次
@daily command

你可以把需要每个小时运行一次的脚本放到/etc/cron.hourly目录下,cron守护进程会每个小时都运行一次。

3.4 注意事项

  • 新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
  • 当crontab失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
  • 千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
  • 在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。

4 参考文献

更新时间:2020-08-27 17:07:11

本文由 清水河恶霸 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:http://ql.magic-seven.top/2020/08/27/linux利用crontab添加定时任务.html
最后更新:2020-08-27 17:07:11

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×