第1章 定时任务介绍

1.1 什么是定时任务?

crondlinux系统中用来定期执行命令或指定程序任务的一种服务或软件。一般情况下,我们按装完操作系统后,默认遍会启动crond服务调度服务,在我们面前的系统安装及开机启动优化设置中,我们也设置保留了crond开机启动。crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。如果有。变会根据埼玉县设定的定时任务规则执行该定时任务。这个crond定时任务就相当于我们平时早起使用的闹钟一样。

特殊需求:crond服务搞不定了(如任务精确到秒),一般工作中写脚本守护进程执行。

这里要求理解进程、程序、守护进程之前的关系。

1.2 linux系统crond的定时任务

       linux系统中定时任务调度工作可以分为以下两种情况:

1.2.1 linux系统自身定期执行的任务工作:

系统周期性自行执行的任务工作,如轮询系统日志、备份系统数据、清理系统缓存等,这些任务无需我们认为干预。如:

[root@oldboy ~]# ll /var/log/messages*

-rw-------  1root root  838513 Sep  8 23:52 /var/log/messages

-rw-------. 1 root root  496687 Aug 14 19:59/var/log/messages-20160814

-rw-------. 1 root root 1614991 Aug 21 12:14/var/log/messages-20160821

-rw-------  1root root 1419878 Aug 28 08:45 /var/log/messages-20160828

-rw-------  1root root 1104533 Sep  4 11:22/var/log/messages-20160904

1.2.2   用户执行的任务工作:

某个用户或系统管理员定期要做的任务工作,例如每隔5分钟和互联网上时间服务同步(这是安装系统基础优化部分的内容),每天晚上0点备份网站站点数据及数据库数据,一般这些工作需要由每个用户自行设置才行。所谓的用户就是读者或者在做的小伙伴。

       例如:服务器时间同步

[root@oldboy ~]# crontab -l

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

linux系统下定时任务软件种类

1.3 linux系统下定时任务软件

atcrontabanacron.

at定时任务,是一种临时性的定时软件,在命令行设置at定时任务,只会执行一次,然后失效。跟windowscmd中的at定时任务类似。(不常用)

anacron定时任务,该定时任务可以在系统关机后,将关机期间的没有执行的定时任务在开机的时候自动都执行一遍。然而在生产环境中,服务器是不允许停机的,所以该服务基本上也不会用到。(几乎不用)

crond定时任务,该服务是生产环境普遍用到的定时任务,可以精确到分钟。在系统优化中的精简开机服务启动项中将该服务保留,开机启动。

第2章 定时任务crond使用说明

2.1 指令语法

crond定时任务的命令为crondtab,常用选项:

crontab [-u user] file

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

              -u(user)执行该定时任务的用户

              -l(list)查看定时任务列表

              -e(edit)编辑定时任务

2.2 定时任务的文件

定时任务的执行是由系统每隔一分钟,系统自动扫描一次定时任务的定时文件,如果存在定时任务,就执行相应的命令。

2.2.1 系统定时任务文件:

[root@oldboy ~]# cat /etc/crontab

SHELL=/bin/bash                             #默认编辑器

PATH=/sbin:/bin:/usr/sbin:/usr/bin          #定时任务中的PATH黄金变量

MAILTO=root                                 #默认生成文件的位置

HOME=/

 

# 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 beexecuted

系统定时任务有七部分组成:分、时、日、月、周、用户和命令。

2.2.2 用户的定时任务文件

用户定时任务文件在/var/spool/cron/下,

如系统的定时任务文件:

cat /var/spool/cron/root

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null2>&1

用户的定时任务由六部分组成:分、时、日、月、周、命令。

查看系统定时任务:

[root@oldboy ~]#crontab -l

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

编辑系统定时任务:

[root@oldboy ~]# crontab -e

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

crontab -e编辑定时任务实际上就是将定时任务写到定时任务文件/var/spool/cron/root中,也可以直接将定时任务追加到该文件中。crontab -e的用法好处是系统自动检测语法是否错误。所以初学者建议用此方法。

                             

2.3 定时任务中的时间表示

定时任务中的时间是由一些特殊的字符和数字以特殊的排序组成的。

符号

用法

*

*代表的意思,在什么位置上就代表没多长时间。

如:* * * *  *   表示每分钟

     00 * * * * 表示每小时的整点

“,”表示间隔的时间,当时间不连续时,可以用逗号分隔开

如:15,30,45 *  * * *   表示每小时的第153045分钟时执行命令。

-

-”可以用来表示连续的时间段,从某一时间开始到某一时间结束。

如:00  23,01-07 * * *  表示每天的晚上23点到第二天早上的7点的整点执行命令。

/

/”表示每隔的意思,就是每隔多长时间。

*/5 * * * *   表示每隔5分钟执行一次命令

注意与*的区别

 

第3章 定时任务案例练习

实例3-1 

每隔五分钟同步一次系统的时间

/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

实例3-2 

每分钟执行一次脚本/server/scripts/tar.sh

* * * * * /bin/sh /server/scripts/tar.sh>/dev/null 2>&1

实例3-3 

每天晚上12点执行脚本/bin/sh/server/scripts/tar_html.sh

00 00 * * * /bin/sh /bin/sh/server/scripts/tar_html.sh >/dev/null 2>&1

实例3-4 

每个月的4号和每周的周一至周三的上午11点整重启Apache服务

00 11 4 * 1-3 /oldboy/weberber/apache/bin/apachectl restart

实例3-5 

* 23,00-07/1 * * * /application/apache/bin/apachectlgraceful

以上不是表示每天晚上的23点到第二天的早上七点每小时重启一次Apache服务。

实际表达的意思是每分钟执行一次命令

若要表示每小时执行一次重启服务的正确写法是:

00 23,00-07/1 * * * /application/apache/bin/apachectl graceful

第4章 企业书写定时任务规范

在生产环境中,操作正确的重要性是不言而喻的。为了避免操作中的失误,规范的操作流程是做到减少失误的有效方法,下面以一个生产环境的案例来说明一下操作的正确流程。

4.1 实例演示规范操作

实例4-1规范定时任务案例:

每分钟打包备份/etc/services文件一次到/tmp目录下,要求打包文件不被覆盖。

1、在命令行下测试成功

[root@oldboy ~]# cd /etc/

[root@oldboy /etc]# tar -zcf/tmp/services_backup$(date +%F-%H-%M).tar.gz services

[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-37.tar.gz

/tmp/services_backup2016-09-09-22-37.tar.gz

2、将执行命令写入脚本

[root@oldboy ~]# mkdir -p /server/scripts/

[root@oldboy /etc]# vim/server/scripts/backup_services.sh

  1#!/bin/bash

  2 cd /etc/&&\

  3 /bin/tar-zcf /tmp/services_backup$(date +%F-%H-%M).tar.gz services

将前面执行成功的命令复制到脚本中,防止手动敲错。

3、测试脚本

[root@oldboy /etc]# /bin/sh/server/scripts/backup_services.sh

[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-*

/tmp/services_backup2016-09-09-22-37.tar.gz

/tmp/services_backup2016-09-09-22-43.tar.gz

测试脚本时要用全路径,测试完成注意查看测试结果

4、编写定时任务

[root@oldboy /etc]# crontab -l |tail -2

#backup services by crh at 2016-09-09

* * * * * /bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1

注意定时任务的时间书写格式,以及业务要求中的时间;

定时任务的命令要执行直接复制命令行中执行脚本的命令;

定时任务中执行脚本后结果记得定向到/dev/null中;

写完定时任务注意查看是否正确

5、查看定时任务执行效果

[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-*

/tmp/services_backup2016-09-09-22-49.tar.gz

/tmp/services_backup2016-09-09-22-50.tar.gz

/tmp/services_backup2016-09-09-22-51.tar.gz

/tmp/services_backup2016-09-09-22-52.tar.gz

/tmp/services_backup2016-09-09-22-53.tar.gz

[root@oldboy /etc]# tail -f /var/log/cron

…………

Sep  922:50:01 oldboy CROND[1542]: (root) CMD (/usr/lib64/sa/sa1 1 1)

Sep  922:51:01 oldboy CROND[1551]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)

Sep  922:52:01 oldboy CROND[1557]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)

Sep  922:53:01 oldboy CROND[1563]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)

查看执行的结果是否正确;

跟踪定时任务日志tail -f /var/log/cron 查看状态

6、尽量多环境测试后在上产线。

个人的虚拟机测试à办公室环境测试àIDC机房测试àIDC正式环境

4.2 定时任务规范操作步骤:

1、在命令行下测试成功

2、将执行命令写入脚本

3、测试脚本

4、编写定时任务

5、查看定时任务执行效果

6、尽量多环境测试后在上产线。

4.3 定时任务规范习惯

1、注释【规范和习惯】

2、命令放脚本文件里

3、进入目标的上级目录打包

4、命令在命令行测试好,然后复制后放入脚本

5、脚本文件要放在固定的规范的目录/server/scripts

6、取消tar命令及脚本的无用输出

7、脚本名字用.sh结尾

8、脚本前面要用/bin/sh执行脚本,并且脚本也要全路径

9、复制执行的全路径的脚本到定时任务里配置,或者配置好定时任务后,复制定时任务命令到命令行测试。

10、           定时任务的结尾要加上>/dev/null 2>&1


第5章 企业案例

5.1 企业案例:inode被填满的企业案例子。

邮件消息队列文件

CentOS5   /var/spool/clientmquenue/

CentOS6      /var/spool/postfix/maildrop/

和定时任务相关的原因:

在定时任务中,定时任务执行出现错误,但是有没有讲错误输出定向到/dev/null中,而且系统中的邮件服务有没有开启,导致系统报错小文件堆积在邮件消息队列文件下,占用完系统的inode

解决办法:

1、将邮件服务打开,

2、将定时任务的结果定向到/dev/null 

5.2 linux定时任务生产java服务无法执行问题群友案例

http://oldboy.blog.51cto.com/2561410/1541515

分析:

conrd定时任务中的环境变量只包含了系统中的小部分,在执行命令的时候如果没有加全路径或将环境变量加入到脚本中,就会导致定时任务执行失败。所以在定时任务中执行的命令要加上全路径。在特殊情况下(Java)要将环境变量导入到执行的脚本中。使得定时任务能够正确执行。