计划任务包括两种类型:
1、一次性计划任务 :未来某个时间执行一次指定任务。
2、周期性计划任务 :每到指定时间点就执行指定的任务,周期性重复执行。
一次性计划任务,常用有两个命令都可以实现此功能:at
、 batch
周期性计划任务,常用主要有有一个命令: crontab
本篇主要讲解crontab命令详细用法:
特别注意:
1、crontab计划任务的执行结果都会以邮件形式告知到执行任务的用户,可以使用mail命令查看相应邮件。
2、如果crontab计划任务中执行的命令是后安装添加的,使用该命令时一定要跟完整路径,因为如果该命令不在cron的PATH变量中,会提示找不到该命令导致任务无法正常执行(建议都加上完整路径,使用whereis命令查询)!
1、crontab安装包
centos 7.4最小化安装已经包含的cron的包,有以下三个:
1 2 3 4 5 |
[root@imzcy ~]# rpm -qa |grep cron cronie-anacron-1.4.11-17.el7.x86_64 crontabs-1.11-6.20121102git.el7.noarch cronie-1.4.11-17.el7.x86_64 [root@imzcy ~]# |
cronie:主程序包,提供了crond守护进程及相关辅助工具;
cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务。
crontabs:包含CentOS提供系统维护任务
2、任务类型:
2.1、系统cron任务:系统维护作业(直接编辑/etc/crontab文件新增计划任务作业也能实现执行系统级的计划任务,格式和crontab -e一样)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@imzcy ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .----------------- 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 # | | | | | # * * * * * user-name command to be executed [root@imzcy ~]# |
2.2、用户cron任务:使用crontab命令
上面是定义系统cron所以需要指定以哪个用户身份来运行后面命令;但是我们如果定义用户cron本身就是针对指定用户来创建的,就不需要指定以哪个用户身份来运行了。
crontab格式:
1 2 |
* * * * * command to be executed 分 时 日 月 周 执行命令 |
crontab常用选项:
1 2 3 4 5 |
-l :列出所有任务 -u :指定操作的用户(仅root可运行,代为指定用户管理cron任务) -e :编辑任务 -r : 移除所有任务 -i : 同-r一同使用,以交互式模式让用户有选择地移除指定任务 |
时间表示法:
1 2 3 4 5 6 7 8 9 10 11 12 |
(1)特定值: 给定时间点有效取值范围内的值; (2)* 给定时间点上有效取值范围内的所有值; 表示“每”,在分上表示每分钟,在小时上表示每小时 (3)离散取值: , #,#,# (4)连续取值: - #-# (5)在指定时间范围上,定义步长: /#: #即为步长 */3 如果在分钟上,表示每3分钟执行一次。 |
3、创建用户cron任务(三种方法)
3.1、直接执行crontab -e
命令即可为当前登入用户编辑创建计划任务(和使用vi编辑文件一样,最后使用wq保存退出即可)
1 2 3 4 5 6 7 8 |
[root@imzcy ~]# crontab -e no crontab for root - using an empty one */10 * * * * /usr/bin/echo "hello world!" ~ ~ "/tmp/crontab.C1l0Uo" 1L, 42C written crontab: installing new crontab [root@imzcy ~]# |
root用户可以加-u选项,为指定用户创建计划任务。
1 |
[root@imzcy ~]# crontab -u zcy -e |
3.2、编辑cron计划任务文件来创建任务
正常我们通过crontab -e命令创建的计划任务,都会记录在/var/spool/cron/目录下以用户名为名称的文件中。所以我们直接编辑该文件也能起到同样的效果(当然只有root用户有权限直接在这个目录下进行读写)
3.2.1 首先查看当前用户已定义的任务
1 2 3 |
[root@imzcy ~]# crontab -l */10 * * * * /usr/bin/echo "hello world!" [root@imzcy ~]# |
3.2.2 查看计划任务文件
1 2 3 4 |
[root@imzcy ~]# ll /var/spool/cron/ 总用量 4 -rw-------. 1 root root 42 9月 9 19:20 root [root@imzcy ~]# |
3.2.3 编辑root用户计划任务文件,新增一行内容
1 2 3 4 5 6 |
[root@imzcy ~]# vi /var/spool/cron/root */10 * * * * /usr/bin/echo "hello world!" */5 * * * * /usr/bin/echo "test2" ~ "/var/spool/cron/root" 2L, 76C written [root@imzcy ~]# |
3.2.4 再使用crontab -l查看root用户计划任务,发现已经增加一个
1 2 3 4 |
[root@imzcy ~]# crontab -l */10 * * * * /usr/bin/echo "hello world!" */5 * * * * /usr/bin/echo "test2" [root@imzcy ~]# |
3.3、从文件中导入cron任务(格式要正确,并且会覆盖当前cron任务)
3.3.1 创建一个root.cron的文件,按指定格式添加一行内容
1 2 3 |
[root@imzcy ~]# vi root.cron 10 * * * * /usr/bin/echo "test" [root@imzcy ~]# |
3.3.2 使用crontab命令并后面跟上刚才创建的文件(如果格式正常,则会覆盖导入其中的计划任务)
1 |
[root@imzcy ~]# crontab root.cron |
3.3.3 再查看用户的计划任务,发现已经发生改变
1 2 3 |
[root@imzcy ~]# crontab -l 10 * * * * /usr/bin/echo "test" [root@imzcy ~]# |
3.3.4 root用户也可以加-u选项为指定用于导入计划任务文件
1 2 3 4 |
[root@imzcy ~]# crontab -u zcy root.cron [root@imzcy ~]# crontab -u zcy -l 10 * * * * /usr/bin/echo "test" [root@imzcy ~]# |
4、执行时间示例
4.1 每天的5点21分执行任务
1 |
21 05 * * * /usr/bin/echo "www.imzcy.cn" |
4.2 每个月8号的5点21分执行任务(指定日期的时候,前面时和分也要填,不然只在日期上写的后,前面为时和分都是*,就相当于那一天的每分钟都执行任务)
1 |
21 05 08 * * /usr/bin/echo "www.imzcy.cn" |
4.3 每隔6分钟执行任务
1 |
*/6 * * * * /usr/bin/echo "www.imzcy.cn" |
4.4 每小时的15,35,55分的时候执行任务
1 |
15,35,55 * * * * /usr/bin/echo "www.imzcy.cn" |
4.5 每小时的30-40内每分钟执行一下任务
1 |
30-40 * * * * /usr/bin/echo "www.imzcy.cn" |
4.6 每隔10秒执行下任务
1 |
* * * * * for i in `seq 1 6` ; do /usr/bin/echo "www.imzcy.cn" > /dev/pts/0 ; sleep 10 ; done |