1.什么是定时任务

crond是linux下用来定期执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完 成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。有点类似于闹钟。

特殊需求:crond服务搞不定了,一般工作中写脚本守护程序执行。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。(守护进程:持续运行的程序

类似的定时任务还有:at,anacron,但这两个生产工作中很少使用,可以忽略

1.1 系统任务调度:

系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。

在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

  1. SHELL=/bin/bash  

  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin  

  3. MAILTO=root  

  4. HOME=/  

  5. # run-parts  

  6. 01 * * * * root run-parts /etc/cron.hourly  

  7. 02 4 * * * root run-parts /etc/cron.daily  

  8. 22 4 * * 0 root run-parts /etc/cron.weekly  

  9. 42 4 1 * * root run-parts /etc/cron.monthly  

2.2 用户任务调度:

用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

2.crontab工具的使用

(1)crontab的使用格式

crontab常用的使用格式有如下两种:

crontab [-u user] [file]
crontab [-u user] [-e|-l|-r |-i]

选项含义如下:

* -u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
* file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
* -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
* -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab内容。
* -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
* -i:在删除用户的crontab文件时给确认提示。

PS : crontab [-e|-l|-r |-i]其实就是操作/etc/spool/cron/下的用户文件

2)crontab文件的含义

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,

它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command
其中:
* minute: 表示分钟,可以是从0到59之间的任何整数。
* hour:表示小时,可以是从0到23之间的任何整数。
* day:表示日期,可以是从1到31之间的任何整数。
* month:表示月份,可以是从1到12之间的任何整数。
* week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
* command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符

* 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
* 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
* 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
* 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。

同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

(3)crontab文件举例

  1. 0 */3 * * * /usr/local/apache2/apachectl restart  

  2. #表示每隔3个小时重启apache服务一次。  

  

  1. 30 3 * * 6 /webdata/bin/backup.sh  

  2. #表示每周六的3点30分执行/webdata/bin/backup.sh脚本的操作。  

     

  3. 0 0 1,20 * *  fsck /dev/sdb8  

  4. #表示每个月的1号和20号检查/dev/sdb8磁盘设备。  

  5. 10 5 */5 * *  echo "">/usr/local/apache2/log/access_log  

  6. #表示每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理apache日志操作。  

 

PS:周和日尽量不要同时用,否则可能达不到想要的效果

例:每周日,上午9点听课

00 09 * * 0 听课

3.crontab实战步骤及注意事项

3.1crontab打包实战

1)进入打包文件或目录的上级目录进行打包

2)定时任务是按小时,打包里的日期也要精确到小时

3)确保命令执行正确,然后写到脚本(复制)

4)定时任务命令或程序最好写到脚本里执行

5)测试脚本正确性(定时任务怎么写,命令行就怎么测试)

6)脚本测试好了,命令行的命令也要复制

7)脚本的路径是要有规范

8)定时打包或处理其他工作,不要再屏幕输出,可以打到日志文件里

3.2工作中调试定时任务的方法

1)增加执行任务频率调试任务

每分钟或者系统时间之后5分钟执行,看看结果对不对

某些任务不能用于生产环境,没有测试机会

代码,配置变更发布流程:

个人开发环境--办公测试环境--IDC机房测试环境--IDC正式环境(分组,灰度发布)

2)调整系统时间调试任务(不能直接用于生产环境)保持5分钟

3)通过脚本日志输出调试定时任务

4)注意一些任务命令带来的问题

tar zcvf echo 123 >a.log

5)注意:环境变量导致定时任务故障(jave)

6)通过crond定时任务服务日志调试定时任务(/var/log/cron

7)其他方法

3.3crontab注意事项

1)为定时任务规则加必要的注释

2)执行shell脚本任务前加/bin/sh

3)定时任务命令或脚本结尾加>/dev/null 2>&1

4)定时任务命令或程序最好写到脚本里执行

5)在指定用户下执行相关的定时任务

6)生产任务程序不要随意打印输出信息

    tar zcvf echo 123 >a.log

7)定时任务执行的脚本要规范路径(/server /scripts)

8)配置定时任务规范操作过程

PS:/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null因此标准错误也会重定向到/dev/null,避免邮件日志问题