一、crond定时任务概述
1、什么是crond
crond服务时Linux系统用来定期执行命令或者指定程序任务的一种服务或者软件。一般在Centos5/Centos6系统中默认安装。crond服务默认是每分钟检查系统中是否有定期执行的定时任务,如果有就会根据预先编写的程序来执行这个定时任务。
2、为什么需要crond
服务器上有很重要的数据需要备份通过crond执行定时任务可以进行备份,另外还可以执行一些需要定时执行的脚本。
3、定时任务的分类
- 系统定时执行任务
- 用户定时执行任务
# 系统定时任务 [root@localhost ~]# ll /etc/|grep cron -rw-------. 1 root root 541 Mar 31 2016 anacrontab drwxr-xr-x. 2 root root 36 Oct 11 22:19 cron.d drwxr-xr-x. 2 root root 42 Oct 1 14:30 cron.daily -rw-------. 1 root root 0 Mar 31 2016 cron.deny drwxr-xr-x. 2 root root 22 Oct 1 14:29 cron.hourly drwxr-xr-x. 2 root root 6 Jun 10 2014 cron.monthly -rw-r--r--. 1 root root 485 Oct 13 22:24 crontab -rw-r--r--. 1 root root 451 Oct 13 22:24 crontab.ori drwxr-xr-x. 2 root root 6 Jun 10 2014 cron.weekly # 用户执行的定时任务会创建在用户的目录下通过crontab -l 可以查看
下面主要介绍用户自定义的定时任务。
二、crond定时任务使用
crond是应用的程序,而crontab命令则是设置crond定时服务规则的命令。
(一)crontab命令
通过--help命令可以查看其用法:
[root@localhost ~]# crontab --help crontab: invalid option -- '-' crontab: usage error: unrecognized option Usage: crontab [options] file crontab [options] crontab -n [hostname] Options: -u <user> define user -e edit user's crontab -l list user's crontab -r delete user's crontab -i prompt before deleting -n <host> set host in cluster to run users' crontabs -c get host in cluster to run users' crontabs -s selinux context -x <mask> enable debugging Default operation is replace, per 1003.2
参数 | 说明 | 实例 |
-u | 指定用户执行定时任务 | crontab -u bright -l |
-e | 编辑crontab文件内容,e可理解为edit的缩写 | crontab -e |
-l | 查看crontab文件的内容,l可理解为list的缩写 | crontab -l |
-r | 删除crontab文件的内容 | crontab -r |
-i | 删除crontab文件内容前会进行提示 | crontab -i |
crontab命令实际上就是在操作/var/spool/cron/当前用户 这样的文件。
当用户创建完定时任务规则后,这些规则的文件会默认存放到/var/spool/cron下面,其中crontab的配置文件名与用户名称一致,比如root用户的定时任务配置文件会存放在/var/spool/cron/root。
系统和用户自定义的定时任务书写格式不同。其中用户的定时任务分为6段,每段通过空格进行区分;系统定时任务(/etc/crontab)分为8段,每段也是通过空格进行区分。它们前5段是时间设定段,后面是执行的命令或者脚本。
[root@localhost ~]# 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: # .---------------- 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 # | | | | | # * * * * * user-name command to be executed * */1 * * * ntpdate time.nist.gov
每段含义:
段 | 说明 | 取值范围 |
第一段 | 代表分钟 | 00-59 |
第二段 | 代表小时 | 00-23 |
第三段 | 代表天 | 01-31 |
第四段 | 代表月 | 01-12 |
第五段 | 代表周几 | 0-7(0和7都表示星期日) |
crontab中特殊符号含义:
符号 | 说明 |
* | 表示任意时间,可以理解为“每”的意思,比如:12 * * * * cmd表示每时的12分执行cmd命令 |
- | 表示一个时间段,比如:00-12 * * * * cmd表示每时的12分钟前都在执行cmd命令 |
, | 表示分割时间段,比如:12 11,12,13 * * * cmd表示每日11、12、13点的12分执行cmd命令 |
/n | n表示数字,表示每隔n个单位。例如:每隔10min执行一次cmd命令,*/10 * * * * cmd,*/10中的*表示00-59,也可以协程00-59/10 |
注意,对于定时任务,如果说到小时级别,最多提到的就是天。对于crontab中规则可按照“分、时、日、月、周”进行记忆。显然对于秒级的任务crond是无能为力的,只能通过其它手段来实现。
(二)实例
1、编辑语法
命令 | 实际操作 | 说明 |
crontab -e | /var/spool/cron/root | crontab -e会检查语法,如果通过echo、vim等进行编辑则不会 |
visudo | /etc/sudoers | visudo会检查语法,如果通过echo、vim等进行编辑则不会 |
2、实例
# 每分钟打印一次名字到/project/temp/bright.log文件中 crontab -e * * * * * echo "Bright" >> /project/temp/bright.log # 每周六、日上午10:00打印日期 [root@localhost temp]# touch print.sh [root@localhost temp]# echo 'date +%F'>print.sh crontab -e * 10 * * 0,6 /bin/sh /project/temp/print.sh>/dev/null 2>&1
3、注意事项
- 定时任务加必须要的注释进行说明
- 执行shell脚本前加/bin/sh ,这样可以在脚本没有执行权限下进行定时执行
- 尽量使用crontab -e,这样进行语法检查
- 定时任务命令结尾加 >/dev/null 2>&1
(三) >/dev/null 2>&1
>/dev/null 2>&1等价于1>/dev/null 2>/dev/null,其中,>表示重定向,/dev/null为特殊的字符设备文件,表示黑洞设备或者空设备。2>&1表示让标准错误和标准输出一样。这个命令表示将脚本的正常输出和错误都重定向到/dev/null,不记录任何输出。
1、重定向
将数据传到其它地方,这个命令会将本该出现在屏幕上的数据传输到其它地方。
符号 | 说明 |
>或者1> | 输出重定向。把前面的输出输入到后面的文件中,会删除文件原有的内容。 |
>>或者1>> | 追加重定向。把前面的输出追加到后面的文件中,不会删除文件原有的内容。 |
<或者<0 | 输入重定向。用于改变命令的输入,指定输入内容,后跟文件名。 |
<<或者<<0 | 输入重定向。用来表示“输入结束”,后跟字符串。 |
2> | 错误重定向。把错误信息输入到后面的文件中,会删除文件原有的内容。 |
2>> | 错误追加重定向。把错误信息追加到后面的文件中,不会删除文件原有的内容。 |
2、注意
如果定时命令不加>/dev/null 2>&1,可能会有大量的输出信息,时间长了,由于未开启邮件服务导致临时文件目录/var/spool/clientmqueue被占满,从而无可用的innode,系统磁盘被占满。
使用上面的命令则会解决这个问题,另外如果系统是centos5.8以上的,比如centos6.x一般不会有上述问题。