首页 > 代码库 > 图文详解crond定时任务

图文详解crond定时任务

1crontd的介绍

  1.1crond的含义

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

1.2关于任务调度的分类

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

1.系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/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

前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

2.用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

1.3使用者权限文件:

文件:/etc/cron.deny

说明:该文件中所列普通用户不允许使用crontab命令

文件:/etc/cron.allow

说明:该文件中所列用户允许使用crontab命令

文件:/var/spool/cron/

说明:所有用户crontab文件存放的目录,以用户名命名

1.4 crontab文件的含义:

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

minute 表示分钟,可以是从059之间的任何整数。

hour:表示小时,可以是从023之间的任何整数。

day:表示日期,可以是从131之间的任何整数。

month:表示月份,可以是从112之间的任何整数。

week:表示星期几,可以是从07之间的任何整数这里的07代表星期日。command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

用表格说明:如下

技术分享

2 关于crond服务

2.1安装crontab

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

查看crontab服务状态:service crond status

手动启动crontab服务:service crond start

查看crontab服务是否已设置为开机启动,执行命令:ntsysv

加入开机自动启动:chkconfig level 35 crond on

2.2 crontab命令详解

1.命令格式:

crontab [-u user] file

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

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

filefile是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。


例:为了防止计划任务被删除,写一个shell每天备份一次 

mkdir -p /home/enrnd/crontab_bak 创建目录

 touch  crontab_bak.sh  创建文件

打开 crontab_bak.sh,添加内容

  crontab –l > /home/enrnd/crontab_bak/crontab`date ‘+%Y%m%d’`.txt

创建计划任务

crontab -e ,添加如下内容

0 9 * * * /home/enrnd/crontab_bak/crontab_bak.sh

2.3定时任务的种类:

1.crontab:这个命令可以周期性的执行任务工作,例如:每五分钟做一次服务器时间同步。要执行crontab这个命令,也需要启动一个服务crond才可以,这个crontab命令是在生产工作中最常用到的命令

2.anacron:这个命令主要用于非7*24小时开机的服务器准备的,anacron并不能指定具体时间执行任务工作,而是以天为周期或者在系统每次开机后执行的任务工作,它会检测服务器停机期间应该执行,但并没有进行的任务工作,并将该命令执行一遍

3.at:适合仅执行一次就结束的调度任务命令,例如:某天晚上需要处理一个任务,仅仅是这一天的晚上,属于突发性的工作任务,要执行at命令,还需要启动一个名为atd的服务才行,工作中很少使用

注:1.我们说的crond服务是运行的程序,而crontab命令用户用来设置定时规则的命令

        2.crond服务是企业生产工作中常用的重要服务

        3.几乎每个服务器都会用到crond服务


4.系统自动轮询任务的设置配置路径:

ls -l /etc/|grep cron

cd /etc/logrotate.d  把用户创建的定时任务放在此目录下


例:每5分钟让risesmbserver和域服务器的时候做同步

*/5 * * * * /usr/sbin/ntpdate 192.168.0.37 > /dev/null 2>&1


有些运维会把定时任务放在 /etc/crontab目录下,不支持放在此目录下

crontab 编辑的定时任务依赖的服务

chkconfig --list crond 查看是否开机启动


/etc/init.d/crond status   查看服务有没有运行


ps -ef |grep crond|grep -v grep


2.4.举例说明参数的使用说明

例:如何在指定的用户下执行crontab命令

 useradd rise  #新建rise用户

 cd -

 crontab -u rise -e #可以编辑文件


2.5.crontab语法格式中特殊符号含义如下并举例说明:

特殊符号:

*:星号,表示任意时间都,实际就是每的意思,例如00 23 * * * cmd表示每月每周每日的2300都执行cmd任务。如果位上是*就是该位上时间的取值范围,如小时上的*等同于00-23,分上的*等同于00-59

注:定时任务规则如果到小时,口述时就最多提每天

-:减号,表示分隔符,表示一个时间范围,区间段,

如每天的171819点的00分执行任务,00 17-19 * * * cmd

,:逗号,表示分隔时段的意思。

例:每天171819点的半点执行一个rise.sh的脚本命令

30 17,18,19 * * * /bin/sh/scripts/rise.sh

/n:n代表数字,即每隔n单位时间

例:每10分钟执行一次任务

*/10 * * * * cmd

例:每6小时的半刻运行这个命令

30 */6 * * * cmd                

30 00-23/6 * * * cmd


2.5 关于crontab的一些实例

1:每天早点8点到18点,每二小时的半刻运行这个命令

30 8-18/2 * * * cmd

2:每月的1,10,22号的445分重启smb服务器

45 4 1,10,22 * * /etc/init.d/smb restart

3:晚上23点和早上0点到7点,每隔一小时重新启动smb

00 23,00-07/1 * * * /etc/init.d/smb restart 

44月的周一到周三11点重启服务

00 11 * 4 1-3 /etc/init.d/smb restart

5:制定一个计划任务输出时间,让他每15分钟运行一次

00,15,30,45,08-18 * * * date

6:每小时的第3和第15分钟执行

3,15 * * * * command

7:在上午8点到11点的第3和第15分钟执行

3,15 8-11 * * * command

8:每隔两天的上午8点到11点的第3和第15分钟执行

3,15 8-11 */2 * * command

9:每个星期一的上午8点到11点的第3和第15分钟执行

3,15 8-11 * * 1 command

10:每晚的21:30重启smb 

30 21 * * * /etc/init.d/smb restart

11:每月11022日的4 : 45重启smb 

45 4 1,10,22 * * /etc/init.d/smb restart

12:每周六、周日的1 : 10重启smb

10 1 * * 6,0 /etc/init.d/smb restart

13:每天18 : 0023 : 00之间每隔30分钟重启smb 

00,30 18-23 * * * /etc/init.d/smb restart

14:每星期六的晚上11 : 00 pm重启smb 

00 23 * * 6 /etc/init.d/smb restart

15:每一小时重启smb 

00 */1 * * * /etc/init.d/smb restart

16:晚上11点到早上7点之间,每隔一小时重启smb 

00 23-7/1 * * * /etc/init.d/smb restart

17:每月的4号与每周一到周三的11点重启smb

00 11 4 * mon-wed /etc/init.d/smb restart

18:一月一号的4点重启smb 

00 4 1 * * /etc/init.d/smb restart

19:每小时执行/etc/cron.hourly目录内的脚本

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

说明:

run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了


3章:企业生产环境中的crontab的使用原则

3.1 生产环境下定时任务的专业写法说明

  1:为定时任务规则加必要的注释,写任务时任务规则尽可能的加上注释(最好是英文注释),这是个习惯和规范。最好是什么时间什么人,因为什么事写的定时任务,这样是为了让其他的运维人员可以很容易理解任务的信息,从而提高了工作效率

  2:执行定时任务时,如果是执行脚本,请尽量在脚本的签名加上/bin/sh命令,否则有可能忘了为脚本设定执行权限,导致任务无法运行

  3:首先在命令行操作成功,然后复制命令到脚本里,在各个细小环节减少出错的机会

  4:然后测试脚本,测试成功后,复制脚本的规范路径到定时任务配置里,不要手敲

  5:先在测试环境下测试,然后正式环境规范部署

3.2书写定时任务的写法说明

总结:1.为定时任务规则加必要的注释

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

          3.执行shell脚本任务前加/bin/sh

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

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

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

               tar打包的时候尽量减少使用v,这样就会减少垃圾

           7.定时任务执行的脚本要规范路径(绝对路径)

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

注:1.定时任务能不用root就不要在root下操作

2.>/dev/null 2&1问题

sendmail

/var/spool/clientmqyeue  -----邮件的临时队列目录,会产生N个小文件,导致的后果就是把磁盘的inode

postfix

/var/spool/postfix/maildrop/ 小文件太多造成inode索引使用完解决办法

df -i 可以查看inode使用是否满

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

1.增加执行任务频率调试任务(某些任务不能用于生产环境没有测试机会)

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

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

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

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

5.注意环境变量导致的定时任务故障(java

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

7.其他的问题调试的办法

3.4 crontab定时任务生产应用问题的8箴言

1.系统环境变量问题

   crontab执行shell时只能识别位数不多的系统环境变量,一般用户定义的普通变量无法识别,如果在编写的脚本需要使用这些变量,最好使用export重新申明下该变量脚本才能正常执行。例如:生产情况和Java相关的脚本任务和脚本

2.定时任务要用绝对路径

     执行shell,如果使用相对路径,可能出现找不到任务路径的情况

 3.脚本权限问题加/bin/sh

4.事件变量问题用反斜线\%转义,最好用脚本

5.>/dev/null 2>&1问题

6.定时任务规则之前加注释

7.使用脚本程序替代命令行定时任务

8.避免不必要的程序及命令输出

9.切换到目标目录的上一级打包目标

10.定时任务脚本中的程序命令尽量要用全路径(和环境变量的识别有关)

3.5关于crontab企业环境下作业题的分析

作业1:每分钟打印一次自己的名字拼音全拼到/server/log自己的名字命名的文件

mkdir -p /server/log/

touch /server/log/lizheng

#print log at 20170401 by lizheng for...

* * * * * echo lizheng >> /server/log/lizheng

作业总结:1.定时任务不要加注释

                 2.结尾不要有>/dev/null 2>&1(定向到空)

                3./server/log目录必须要存在才能出结果

                  4.定时任务中的路径一定要绝对路径

                  5.crond服务必须开启才能运行


企业面试题:

1.在每周6的凌晨3:15执行/home/shell/collect.pl,并将标准输出和错误输出到/dev/null设备,请写出crontab中的语句

思路:1.命令行先运行此命令

      2.把命令写入脚本内

      3.测试脚本的运行

      4.创建定时任务把脚本复制到crontab

vim /server/scripts/execute.sh

#写入命令行

perl /home/shell/collect.pl

/usr/bin/perl /serer/scripts/exectue.sh

crontab -e

15 03 * * 6 /usr/bin/perl /serer/scripts/exectue.sh > /dev/null 2>&1

2.crontab11月份内,每天的早上6点到12点钟,每隔2小时执行一次/usr/bin/httpd.sh怎么实现

思路:1.命令行先运行此命令

      2.把命令写入脚本内

      3.测试脚本的运行

      4.创建定时任务把脚本复制到crontab

写入命令行

Vim /usr/bin/httpd.sh

bin/sh /usr/bin/httpd.sh

crontab -e

00 06-12/2 * 11 * /bin/sh /usr/bin/httpd.sh > /dev/null 2>&1


附录:crontab书写和排错流程的图文详解

技术分享

图文详解crond定时任务