第1章 定时任务介绍
1.1 什么是定时任务?
crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。一般情况下,我们按装完操作系统后,默认遍会启动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系统下定时任务软件
at,crontab,anacron.
at定时任务,是一种临时性的定时软件,在命令行设置at定时任务,只会执行一次,然后失效。跟windows里cmd中的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 * * * * 表示每小时的第15、30、45分钟时执行命令。 |
- |
“-”可以用来表示连续的时间段,从某一时间开始到某一时间结束。 如: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)要将环境变量导入到执行的脚本中。使得定时任务能够正确执行。