计划任务包括两种类型:
1、一次性计划任务 :未来某个时间执行一次指定任务。
2、周期性计划任务 :每到指定时间点就执行指定的任务,周期性重复执行。
一次性计划任务,常用有两个命令都可以实现此功能:at 、 batch
周期性计划任务,常用主要有有一个命令: crontab
本篇主要讲解crontab命令详细用法:
特别注意:
1、crontab计划任务的执行结果都会以邮件形式告知到执行任务的用户,可以使用mail命令查看相应邮件。
2、如果crontab计划任务中执行的命令是后安装添加的,使用该命令时一定要跟完整路径,因为如果该命令不在cron的PATH变量中,会提示找不到该命令导致任务无法正常执行(建议都加上完整路径,使用whereis命令查询)!
1、crontab安装包
centos 7.4最小化安装已经包含的cron的包,有以下三个:
[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 ~]#
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一样)
[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 ~]#
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格式:
* * * * * command to be executed
分 时 日 月 周 执行命令
1
2
*****commandtobeexecuted
分时日月周执行命令
crontab常用选项:
-l :列出所有任务
-u :指定操作的用户(仅root可运行,代为指定用户管理cron任务)
-e :编辑任务
-r : 移除所有任务
-i : 同-r一同使用,以交互式模式让用户有选择地移除指定任务
1
2
3
4
5
-l:列出所有任务
-u:指定操作的用户(仅root可运行,代为指定用户管理cron任务)
-e:编辑任务
-r:移除所有任务
-i:同-r一同使用,以交互式模式让用户有选择地移除指定任务
时间表示法:
(1)特定值:
给定时间点有效取值范围内的值;
(2)*
给定时间点上有效取值范围内的所有值;
表示“每”,在分上表示每分钟,在小时上表示每小时
(3)离散取值: ,
#,#,#
(4)连续取值: -
#-#
(5)在指定时间范围上,定义步长:
/#: #即为步长
*/3 如果在分钟上,表示每3分钟执行一次。
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保存退出即可)
[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 ~]#
1
2
3
4
5
6
7
8
[root@imzcy~]# crontab -e
nocrontabforroot-usinganemptyone
*/10****/usr/bin/echo"hello world!"
~
~
"/tmp/crontab.C1l0Uo"1L,42Cwritten
crontab:installingnewcrontab
[root@imzcy~]#
root用户可以加-u选项,为指定用户创建计划任务。
[root@imzcy ~]# crontab -u zcy -e
1
[root@imzcy~]# crontab -u zcy -e
3.2、编辑cron计划任务文件来创建任务
正常我们通过crontab -e命令创建的计划任务,都会记录在/var/spool/cron/目录下以用户名为名称的文件中。所以我们直接编辑该文件也能起到同样的效果(当然只有root用户有权限直接在这个目录下进行读写)
3.2.1 首先查看当前用户已定义的任务
[root@imzcy ~]# crontab -l
*/10 * * * * /usr/bin/echo "hello world!"
[root@imzcy ~]#
1
2
3
[root@imzcy~]# crontab -l
*/10****/usr/bin/echo"hello world!"
[root@imzcy~]#
3.2.2 查看计划任务文件
[root@imzcy ~]# ll /var/spool/cron/
总用量 4
-rw-------. 1 root root 42 9月 9 19:20 root
[root@imzcy ~]#
1
2
3
4
[root@imzcy~]# ll /var/spool/cron/
总用量4
-rw-------.1rootroot429月919:20root
[root@imzcy~]#
3.2.3 编辑root用户计划任务文件,新增一行内容
[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 ~]#
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,76Cwritten
[root@imzcy~]#
3.2.4 再使用crontab -l查看root用户计划任务,发现已经增加一个
[root@imzcy ~]# crontab -l
*/10 * * * * /usr/bin/echo "hello world!"
*/5 * * * * /usr/bin/echo "test2"
[root@imzcy ~]#
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的文件,按指定格式添加一行内容
[root@imzcy ~]# vi root.cron
10 * * * * /usr/bin/echo "test"
[root@imzcy ~]#
1
2
3
[root@imzcy~]# vi root.cron
10****/usr/bin/echo"test"
[root@imzcy~]#
3.3.2 使用crontab命令并后面跟上刚才创建的文件(如果格式正常,则会覆盖导入其中的计划任务)
[root@imzcy ~]# crontab root.cron
1
[root@imzcy~]# crontab root.cron
3.3.3 再查看用户的计划任务,发现已经发生改变
[root@imzcy ~]# crontab -l
10 * * * * /usr/bin/echo "test"
[root@imzcy ~]#
1
2
3
[root@imzcy~]# crontab -l
10****/usr/bin/echo"test"
[root@imzcy~]#
3.3.4 root用户也可以加-u选项为指定用于导入计划任务文件
[root@imzcy ~]# crontab -u zcy root.cron
[root@imzcy ~]# crontab -u zcy -l
10 * * * * /usr/bin/echo "test"
[root@imzcy ~]#
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分执行任务
21 05 * * * /usr/bin/echo "www.imzcy.cn"
1
2105***/usr/bin/echo"www.imzcy.cn"
4.2 每个月8号的5点21分执行任务(指定日期的时候,前面时和分也要填,不然只在日期上写的后,前面为时和分都是*,就相当于那一天的每分钟都执行任务)
21 05 08 * * /usr/bin/echo "www.imzcy.cn"
1
210508**/usr/bin/echo"www.imzcy.cn"
4.3 每隔6分钟执行任务
*/6 * * * * /usr/bin/echo "www.imzcy.cn"
1
*/6****/usr/bin/echo"www.imzcy.cn"
4.4 每小时的15,35,55分的时候执行任务
15,35,55 * * * * /usr/bin/echo "www.imzcy.cn"
1
15,35,55****/usr/bin/echo"www.imzcy.cn"
4.5 每小时的30-40内每分钟执行一下任务
30-40 * * * * /usr/bin/echo "www.imzcy.cn"
1
30-40****/usr/bin/echo"www.imzcy.cn"
4.6 每隔10秒执行下任务
* * * * * for i in `seq 1 6` ; do /usr/bin/echo "www.imzcy.cn" > /dev/pts/0 ; sleep 10 ; done
1
*****foriin`seq16`;do/usr/bin/echo"www.imzcy.cn">/dev/pts/0;sleep10;done