首页 > 代码库 > 图文详解crond定时任务
图文详解crond定时任务
第1章crontd的介绍
1.1crond的含义
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与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: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数这里的0或7代表星期日。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用户来运行。
file:file是命令文件的名字,表示将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表示每月每周每日的23:00都执行cmd任务。如果位上是*就是该位上时间的取值范围,如小时上的*等同于00-23,分上的*等同于00-59
注:定时任务规则如果到小时,口述时就最多提每天
-:减号,表示分隔符,表示一个时间范围,区间段,
如每天的17,18,19点的00分执行任务,00 17-19 * * * cmd
,:逗号,表示分隔时段的意思。
例:每天17,18,19点的半点执行一个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号的4点45分重启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
例4:4月的周一到周三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:每月1、10、22日的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 : 00至23 : 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.crontab在11月份内,每天的早上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定时任务