linux系统中的定时任务与两部分组成,一部分是系统中自动的定时任务,叫做系统任务调度,另一种则是用户自己写的定时任务,叫做用户任务调度,交给系统去执行。系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
[root@localhost ~]#
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。
用户定时任务(用户任务调度)用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。它也分两种,一种为一次性定时任务(at命令),另一个是周期性定时任务(crontab命令)。
关系图如下:
今天我们主要讲的是周期性的定时任务。
一.crond 介绍
crond 是linux系统中的用来执行周期性任务的守护进程,安装时会默认安装此进程,crond进程会每分钟定期检查是否有需要执行的任务,如果有,就自动执行该任务。
语法
crontab [ -u user ] file
或
crontab [ -u user ] { -l | -r | -e }
-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
参数说明:
- -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
- -r : 删除目前的时程表
- -l : 列出目前的时程表
- -u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
时间格式如下:
f1 f2 f3 f4 f5 program
- 其中 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 - 7) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
二,实例
(00 23 * * *--每晚23时执行)
(00 17-19 * * * --每晚17-19时执行)
(*/5 * * * *--每隔五分钟执行一次)
(30 3,12 * * *--每天凌晨三点半和中午12点半执行一次)
(30 8-18/2 * * * --早上八点半到下午六点半每隔两个小时执行一次)
(45 4 1,10,22 * *--每月的1日10日22日的凌晨4点45分执行)
(10 1 * * 6,0—每周六周日的凌晨1点十分执行)
(* 23,00-07/1 * * *--每天23点,凌晨12点到早晨7点每小时每一分钟执行一次)
(5月5号上午九点执行:00 09 05 05 *)
(每周日,上午9:30执行:30 09 * * 0)
注意:周和日不要同时用,否则可能达不到想要的效果
三. crontab定时任务生产应用问题7箴言
1、 系统环境变量问题
Crontab执行shell只能识别为数不多的系统环境变量,一般用户定义的普通变量是无法识别的,如果在编写脚本中需要使用这些变量,最好使用export重新声明下该脚本才能正常执行。
2、 定时任务要用绝对路径
Crontab执行shell时,如果shell路径是相对路径或者shell里含有的绝对路径,此时 就会找不到文件。
3、 脚本权限问题加/bin/sh
要保证crontab的执行者有访问shell脚本所在的目录并且执行此shell脚本的权限,最佳的方法就是执行脚本前加/bin/sh,否则有可能因为忘了为脚本设定执行权限,而无法完成任务。
4、 时间变量问题用反斜线
“%”号在crontab任务配置中被认为是newline。需要用“\”来转义。Crontab任务命令中,如果有“date+%Y%m%d”,必须替换为 “date+\%Y\%m\%d”
5、 >/dev/null2>&1问题
当定时任务在你所指定的时间执行,系统会寄信给你,显示该程序执行的内容,若系统未开启邮件服务就会导致邮件临时目录/var/spool/clientqueue碎文件件逐渐增加,wei此命令为了防止占满inode.
6、 定时任务定时规范之前加注释
写定时任务加注释,什么人物,什么时间,因为什么事,干了什么,都要记得清清楚楚。
7、 避免不必要的程序及命令的输出
在开发定时任务程序和脚本时,在调试好脚本程序后,应尽量把DEBUG及命令输出的内容信息屏蔽掉,如果需要,可指向到定时日志文件里,以避免多余的系统垃圾。