目录
- 1 什么是Crond
- 1.1 为什么要使用Crond定时任务
- 1.2 Linux系统Crond的定时任务
- 1.3 Linux系统下定时任务软件种类
- 2 定时任务Crond使用说明
- 2.1 crontab指令语法
- 2.2 crontab命令说明
- 2.3 使用者权限及定时任务文件
- 2.4 crontab指令选项说明含义表
- 2.5 定时任务指令的使用格式
- 2.5.1 crontab语法格式中时间段的含义表
- 2.5.2 crontab语法格式中特殊符号的含义表
- 2.5.3 crontab编辑的定时任务依赖的服务
- 2.6 一些定时任务的例子
- 2.7 生产环境Crontab专业实例
- 3 定时任务书写规范
- 4 定时任务调试过程
-
- 4.1 工作中调试定时任务的方法
- 4.2 crontab定时任务生产用用问题10箴言
-
- 5 crontab生产问题案例及解决过程
- 6 企业面试题及案例
- 6.1 案例分析及解决办法
1 什么是Crond
Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。一般情下我们安装完Centos5/6 linux操作系统之后,默认便会启动Crond任务调度服务,在我们前面的系统安装及开机启动优化的设置中,我们也设置保留了Crond 开机自启动。Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作。这个Crond定时任务服务就相当于我们平时早起使用的闹钟一样。
程序文件:程序代码组成,但是没有在计算机内执行。当前没有执行。
进程:所谓进程就是计算机中正在执行的程序。
守护程序或守护进程:守护进程就是一直运行的程序。
1.1 为什么要使用Crond定时任务
为什么要使用定时任务呢?
举个例子说明: 例如; 我们的数据库或者代码程序需要每天晚上0
点做一次全备,这样每天夜里都需要执行的周期性的工作,如果要让人操作的话,就得每天半夜爬起来,然后登陆系统执行任务,执行完接着睡觉。另外,执行任务的过程也可能持续几个小时,这样以来,一个晚上我们就都不用睡觉了,这样显然是不行的。那么有什么办法来解决这个周期性的执行任务需求呢?
答:
这就是linux系统的定时任务Crond,这相当于我们平时生活中的的闹钟的功能,每天晚上提前设置定时,早晨按时叫醒你。
实时备份,定时备份。
1.2 Linux系统Crond的定时任务
Linux系统中定时任务调度的工作可以分为以下两种情况:
1)Linux系统自身定期执行的任务工作:系统周期性自行执行的任务工作,如轮询系统日志、备份系统数据、清理系统缓存等,这些任务无需我们人为干预。
设置文件:/etc/logrotate.conf
2)用户执行的任务工作:某个用户或系统管理员定期要做的工作任务,例如每隔5分钟和互联网上时间服务器同步(这是安装系统基础优化部分的内容),每天晚上0点备份网站站点数据及数据库数据,一般这些工作需要由每个用户自行设置才醒。所谓的用户就是读者或者在做的伙伴们。
例如:服务器时间同步[root@oldboy ~]# crontab -l*/20 * * * * /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null &
用户执行的任务工作,也就是我们运维管理人员执行的任务工作,因此,用户执行的任务是重点。
1.3 Linux系统下定时任务软件种类
严格的说,linux系统下的定时任务软件还真不少,例如: at,crontab,anacron。
1)at:适合仅执行一次就结束的调变任务命令,例如:某天晚上需要处理一个任务,仅仅是这一天的晚上,属于突发性的工作任务。要执行at命令,还需要启动一个名为atd的服务才行。at已经很少有人在用了,了解即可。
[root@oldboy ~]# chkconfig | grep atdatd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
2)crontab:这个命令可以周期性的执行任务工作,例如:每五分钟做一次服务器时间同步。要执行crontab这个命令,也需要启动一个服务crond才行,这个crontab命令是在生产工作中最常用到的命令。
[root@oldboy ~]# chkconfig | grep crondcrond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3)anacron:这个命令主要用于非7*24小时开机的服务器准备的,anacron并不能指定具体时间执行任务工作,而是以天为周期或者在系统每次开机后执行的任务工作。它会检测服务器停机期间应该执行,但是并没有进行的任务工作,并将该任务执行一遍。
anacron这个也很少用,因为服务器一般很少关机。
提示:
1、我们所说的crond服务是运行的程序,而crontab命令用户用来设置定时规则的命令。
2、crond服务是企业生产工作中常用的重要服务,at和anacron很少使用,可以忽略。
3、几乎每个服务器都会用到crond服务。
4、上千台服务器开发分布式定时任务项目方案。
2 定时任务Crond使用说明
2.1 crontab指令语法
crontab [-u user] filecrontab [-u user] [-l | -r | -e] [-i] [-s]
查看系统帮助:
[root@oldboy ~]# man crontab[root@oldboy ~]# crontab --helpcrontab: invalid option -- '-'crontab: usage error: unrecognized optionusage: crontab [-u user] filecrontab [-u user] [ -e | -l | -r ](default operation is replace, per 1003.2)-e (edit user's crontab)-l (list user's crontab)-r (delete user's crontab)-i (prompt before deleting user's crontab)-s (selinux context)
2.2 crontab命令说明
通过crontab我们可以在固定的间隔时间执行指定的系统指令或script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合(注意:日和周不要组合)crond服务通过crontab命令可以很容易的实现周期性的日志分析或数据备份等企业运维场景工作。
2.3 使用者权限及定时任务文件
文件 | 说明 |
---|---|
/etc/cron.deny | 该文件中所列用户不允许使用crontab命令 |
/etc/cron.allow | 该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny |
/var/spool/cron | 所有用户crontab配置文件默认都存放在此目录,文件名以用户名命名。 [root@oldboy ~]# cat /var/spool/cron/root */20 * * * * /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null & [root@oldboy ~]# crontab -l */20 * * * * /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null & 通过crontab查看或编辑的定时任务规则默认都会放到/var/spool/cron/,以当前用户命名的文件。 定时任务也可以针对普通用户设置,可以在/etc/cron.deny设置禁止执行任务的用户。 [root@oldboy ~]# crontab -e <===> vi /var/spool/cron/root [root@oldboy ~]# crontab -l <===> cat /var/spool/cron/root |
2.4 crontab指令选项说明含义表
参数 | 含义 | 指示示例 |
---|---|---|
-l(字母) | 查看crontab文件内容,提示:l可以理解为list的缩写 | crontab -l |
-e | 编辑crontab文件内容,提示:e可以理解为edit的缩写 | crontab -e |
-i | 删除crontab文件内容,删除前会提示确认。用的很少 | crontab -ri |
-r | 删除crontab文件内容。用的很少 | crontab -r |
-u user | 指定使用的用户执行任务 | crontab -u boy -l |
特别强调: -i,-r参数在生产中很少用,没什么需求必须要用-e进去编辑即可
补充: crontab {-l|-e}实际上就是在操作/var/spool/cron/当前用户这样的文件。
系统帮助: usage:crontab [-u user] file
配置定时任务最好不要在/etc/crontab(7段)配置文件中配置。
而为系统用户定时任务是6段,crontab -e。
2.5 定时任务指令的使用格式
默认情况下,当用户建立定时任务规则后,该规则记录对应的配置文件会存在于/varspool/eron中,其crontab配置文件对应的文件名与登录的用户名一致,如:root用户的定时任务配置文件为/var/spoolcron/root.
Crontab定时任务的书写格式很简单,用户的定时任务规则一般分为6个段(每个段通过空格来分隔,系统的定时任务为/etc/crontab,分为7段,空格来分隔),前五段为时间的设定段,第六段为所要执行的命令或脚本任务段。
基本格式如下:
# crontab -e:
# .—————- 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 …
# | | | | |
# * * * * * command to be executed
用户定时任务:
01 * * * * cmd02 4 * * * cmd22 4 * * 0 cmd42 4 1 * * cmd
每一列之间至少一个空格,最好不要多也不要少
2.5.1 crontab语法格式中时间段的含义表
段 | 含义 | 取值范围(整数) |
---|---|---|
第一段 | 代表分钟 | 00~59 |
第二段 | 代表小时 | 00~23 |
第三段 | 代表日,天 | 01~31 |
第四段 | 代表月份 | 01~12 |
第五段 | 代表星期,周几 | 0-7(0和7都代表星期日) |
时间记忆口诀:分时日月周
2.5.2 crontab语法格式中特殊符号的含义表
特殊符号 | 含义 |
---|---|
* | *号,表示任意时间都,实际就是“每”的意思。 举例:00 23 * * * cmd表示每月每周每日的23:00都执行cmd任务。 需要注意的是:每个时间位上的 * 表示每,如果位上是 * 就是该位上时间的取值范围。 例如:小时上的 * 等价于00-23。 经验技巧:定时任务规则如果到小时,口述时就最多提每天。 分位上的*就等价于0-59,表示每分。 # crontab -e * * * * * cmd (代表每分钟执行cmd命令) |
– | 减号,表示分隔符,表示一个时间范围,区间段, 如17-19点,每天的17,18,19的00分执行任务。 00 17-19 * * * cmd(就是17,18,19整点分别执行的意思) |
, | 逗号,表示分隔时间断的意思 30 17,18,19 * * * /bin/sh /scripts/oldboy.sh(表示每天17,18,和19点的斑点时刻执行/scripts/oldboy.sh脚本)。也可以和“-”结合使用,例如:30 3-5,17-19 * * * /bin/sh /scripts/oldboy.sh |
/n | n代表数字,即“每隔n单位时间”,例如:每10分钟执行一次任务可以写成(*/10 * * * * cmd),其中*/10,*的范围是0\~59,因此也可以写成0-59/10。 |
2.5.3 crontab编辑的定时任务依赖的服务
[root@oldboy ~]# chkconfig --list crondcrond 0:off 1:off **2:on 3:on 4:on** 5:on 6:off[root@oldboy ~]# /etc/init.d/crond statuscrond (pid 1205) is running...[root@oldboy ~]# ps -ef|grep crond|grep -v "grep"root 1205 1 0 Dec16 ? 00:00:00 crond[root@oldboy ~]# /etc/init.d/crond restartStopping crond: [ OK ]Starting crond: [ OK ]
2.6 一些定时任务的例子
- 30 3,12 * * * /bin/sh /scripts/oldboy.sh
第一列为30,表示30分钟,第二列为3,12,这代表3点及12点,此定时任务的意思是每天凌晨3点和中午12点的半点时候(或描述为每天凌晨3:30和中午12:30)执行/scripts/oldboy.sh脚本
- 30 */6 * * * /bin/sh /scripts/oldboy.sh
表示每隔6小时的半点时刻执行/scripts/oldboy.sh脚本任务
- 30 8-18/2 * * * /bin/sh /scripts/oldboy.sh
第一列为30,表示30分钟,第二列8-18/2代表在早晨8点到下午18点之间每隔2小时,也相当于8,10,12,14,16,18单独列出的作用。故此语句表示早晨8点到下午18点之间每隔2小时的半点时刻执行/scripts/oldboy.sh脚本任务。
- 30 21 * * * /etc/init.d/httpd restart
表示每晚的21:30重启apache服务
- 45 4 1,10,22 * * /etc/init.d/httpd restart
表示每月1,10,22日的凌晨4点45重启apache服务
- 10 1 * * 6,0 /etc/init.d/httpd restart
表示每周六、周日的凌晨1:10分重启apache服务
- 0,30 18-23 * * * /etc/init.d/httpd restart
表示在每天18:00至23:00之间每隔30分钟重启apache服务
最后一次执行任务是23:30
- 00 */1 * * * /etc/init.d/httpd restart
表示每隔一小时整点重启apache服务
- * 23,00-07/1 * * * /etc/init.d/httpd restart
这个例子并不表示晚上23点和早上0-7点之间每隔一小时重启apache服务。上面的写法是不规范的,也是不对的,语句的第一列为*,表示每分钟都执行任务即晚上23点和早上0-7点之间每隔一小时的每分钟都重启apache,很可怕的。
- 00 11 * 4 1-3 /etc/init.d/httpd restart
表示4月的每周周一到周三的上午11点整重启apache服务周和日尽量不要同时用,否则可能达不到想要的效果
-
5月5日上午9:00去上课,规则为:
00 09 05 05 * 去上课
-
每周日,上午9:30去上课,规则为:
30 09 * * 0 去上课
30 09 * * 7 去上课
2.7 生产环境Crontab专业实例
例:每分钟打印一次自己的名字拼音全拼到“/server/log自己的名字命名的文件”中。
[root@oldboy ~]# crontab -e# print my name to log by RSQ at 201712* * * * * echo "RSQ" >> /server/log/RSQ.log
注意:
1、定时任务要加注释
2、结尾不要有>/dev/null 2>&1
3、/server/log目录必须要存在才能出结果,如果没有创建这个目录。
4、定时任务中的路径一定要绝对路径
5、crond服务必须首先开启
6、查看定时任务日志tail /var/log/cron
3 定时任务书写规范
规范:
1、注释[规范和习惯]
2、命令放脚本文件里[规范和习惯]
3、进入目标的上级目录打包。
4、命令在命令行测试好,然后复制后放入脚本。
5、脚本文件要放在固定的规范的目录/server/scripts。
6、取消tar命令及脚本内的无用输出。
7、脚本名字用.sh结尾。
8、脚本前面要用/bin/sh执行脚本,并且脚本也要全路径。
9、复制执行的全路径的脚本到定时任务里配置,或者配置好定时任务后,复制定时任务的命令到命令行测试。
10、定时任务的结尾要加上 >/dev/nul1 2>&1
/dev/null 2>&1 == 1>/dev/null 2>/dev/null == &>/dev/null
书写定时任务的若干要领方法:
要领1: 为定时任务规则加必要的注释
要领2: 执行shel1脚本任务前加/bin/sh
要领3: 定时任务命令或脚本结尾加>/dev/null 2>&1
&>/dev/nul 1,1>/dev/null 2>/dev/null
要领4: 定时任务命令或程序最好写到脚本里执行
要领5: 在指定用户下执行相关的定时任务
要领6: 生产任务程序不要随意打印输出信息
tar zcvf echo 123 >a.log
要领7: 定时任务执行的脚本要规范路径(/server/scripts)
要领8: 配置定时任务规范操作过程
4 定时任务调试过程
4.1 工作中调试定时任务的方法
1、增加执行任务频率调试任务
每分钟或者系统时间之后5分钟执行,看看结果对不对。
某些任务不能用于生产环境没有测试机会
代码、配置变更发布流程:
个人开发环境—办公测试环境—>IDC机房测试环境–>IDC正式环境(分组,灰度发布)
2、调整系统时间调试任务(不能直接用于生产环境),保持5分钟。
3、通过脚本日志输出调试定时任务
4、注意一些任务命令带来的问题
例如:
*/1 * * * * echo"==" >> /tmp/oldboy.log >/dev/null 2>&1*/1 * * * * tar zcf /tmp/oldboy_$ (date +%F).tar.gz /etc/hosts >/dev/null 2>&1
5、注意: 环境变量导致的定时任务故障(java)
带环境变量的脚本例子:
#!/bin/sh
#
export
PATH=/usr/local/sbin:/usr/1ocal/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
cd / && \\
tar zcfh /backup/back_$(date +%F).tar.gz etc/rc.local var/spool/cron etc/hosts && \\
find /backup -type f -name "\*.tar.gz" -mtime +3 | xargs rm -f
6、通过crond定时任务服务日志调试定时任务(/var/1og/cron)
7、其他稀奇古怪的问题调试的办法
4.2 crontab定时任务生产用用问题10箴言
1.系统环境变量导致定时任务执行问题
http:/oldboy.blog.51cto.com/2561410/1541515
Linux 定时任务crond那些事
http://oldboy.blog.51cto.com/2561410/1410555
2.定时任务里的命令要用绝对路径
3.脚本权限问题加/bin/sh
4.时间变量问题用反斜线\%转义,最好用脚本。
5.>/dev/null 2>&1问题(1>/dev/null,2>/dev/null,&>/dev/nu11)
6.定时任务规则之前加注释
7.使用脚本程序替代命令行定时任务
8.避免不必要的程序及命令输出
9.切到目标目录的上一级打包目标
10.定时任务脚本中的程序命令尽量用全路径(和环境变量的识别有关)
5 crontab生产问题案例及解决过程
面试题:
在系统维护的时候,创建文件提示“No space left on device”,请问这是什么故障?
解答:
磁盘block满了或者inode被占满了
故障原因:
某年某月某日某时,某人在工作中设置crontab 定时任务规则保存时,提示“No space left on device”,此时用df-h检查磁盘,发现还有剩余空间,用df-i检查则显示/var目录已占用100%的inode数量,看来是inode数量耗尽,导致系统无法在/var目录下创建文件,因为定时任务的配置在/var/spool/cron下,ext3文件系统中,每个文件需要占一个inode.
最后,经过检查发现在/var/spool/clientmqueue/下有超多的文件,执行ls /var/spool/clientmqueue命令查看,有很多小文件在此目录下,执行cd /var/spool/clientmqueue ;rm-f ./* 会自动跳出来,也是无法删除,最后通过只能xargs命令来配合解决。
Centos5 sendmail临时队列目录 /var/spool/clientmqueue
Centos6 sendmail临时队列目录 /var/spool/postfix/maildrop
默认定时任务执行时会给root发邮件,如果邮件服务不开,就会把邮件堆到上述目录。当定时任务不加 >/dev/null 2>&1 的时候,定时任务就会把上述目录就会存在大量小文件
Centos6 postfix关闭(/etc/init.d/postfix stop)
lsof -i :25
邮件临时目录被大量小文件填充/var/spool/postfix/maildrop
解决办法:开启邮件服务,或把定时任务定向到/dev/null 2>&1
6 企业面试题及案例
1、在每周6 的凌晨3:15执行/home/shell/collect.p1,并将标准输出和标准错误输出到/dev/null设备,请写出crontab中的语句。
15 03 * * 6 /usr/bin/per1/home/shell/collect.p1\>/dev/null 2>&1chmod +x /home/shell/collect.pl15 3 * * 06 /home/shell/collect.pl >/dev/null 2>&1
2、crontab在11月份内,每天早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh怎么实现?
00 06-12/2 * 11 * /bin/sh /usr/bin/httpd.sh >/dev/null 2>&1
6.1 案例分析及解决办法
1、网站访问慢的案例
Linux java/http/php中某一个进程占用CPU很高
解决案例:
top -p 32311strace -p 32311
案例文档
http://blog.linuxeye.com/343.html
http://www.tuicool.com/articles/YFVbia
http://blog.sina.com.cn/s/blog_48eef8410101fl4p.html
2、因inode节点耗尽导致执行命令passwd报错处理记录
选自博客:http://blog.sina.com.cn/s/blog_506ed9e6010106kj.html