1. 定时任务比较及cron语法
Linux的任务调度可以分为两类:
|
Linux系统下另外两种定时任务软件:
at:适合仅执行一次的调度任务,需要启动一个名为atd的服务 anacron:这个命令主要用于非7*24小时开机的服务器,anacron并不能指定具体时间执行任务,而是以天为周期或者在系统每次开机后需要执行的任务,它会检测停机期间应该进行,但是并没有进行的crontab任务工作,执行一遍。 这两种比较少用 |
指令语法:
Crontab [-u user] file Crontab [-u user] {-l |-r |-e} |
指令说明:
通过crontab我们可以在固定的间隔时间执行指定的系统指令或shell脚本,时间间隔可以是分钟、小时、日、月、周及以上的任意组合(日和周不要组合)。 |
2. 使用者权限文件
文件 |
说明 |
/etc/cron.deny |
该文件所列用户不允许使用crontab命令 |
/etc/cron.allow |
该文件所列用户允许使用crontab命令 |
/var/spool/cron |
所有用户crontab文件存放的目录,以用户名命名 |
3. 指令选项说明含义表
参数名称 |
含义 |
指定示例 |
-l(字母) |
显示用户crontab文件内容, |
crontab -l |
-e |
进入vi编辑用户crontab文件 |
crontab -e |
-i |
删除用户crontab文件前确认提示 |
crontab -i |
-r |
从crontab目录中删除用户crontab文件 |
crontab -r |
-u user |
指定使用者 |
crontab –u qinbf –l |
4. 指令的使用格式
默认情况下,用户所见建立的crontab文件存放于/var/spool/cron文件中,其crontab对应的文件名与用户名一致。
格式共分为七段,前五段为时间设定段,第六段以哪个用户执行crontab(默认是当前用户),第七段为所要执行的命令段。
5. Crontab时间段的含义如表:
段 |
含义 |
取值范围 |
第一段 |
分钟 |
00-59 |
第二段 |
小时 |
00-23 |
第三段 |
日期 |
01-31 |
第四段 |
月份 |
01-12 |
第五段 |
星期几 |
0-6 |
6. 特殊符号含义如下:
特殊符号 |
含义 |
* |
表示任意时间都 |
- |
减号,表示分隔符,表示一个时间范围段 |
, |
逗号,表示分隔时间段的意思 |
/n |
n代表数字,“即每隔n单位时间” |
7. crontab依赖的服务:
chkconfig --list |grep crond /etc/init.d/crond status |
8. crontab实例说明
1) 30 3,12 * * * /bin/sh /scripts/oldboy.sh 2) 30 */6 * * * /bin/sh /scripts/oldboy.sh #--à第二列*/6表示每6个小时,也相当于6,12,18,24 3)30 8-18/2 * * * /bin/sh /scripts/oldboy.sh #-à第二列8-18/2代表早晨8点到下午18点之间每2小时,也相当于8,10,12,14,16,18 4)* 23-7/1 * * * /application/apachectl restart #----à实际上的效果是,晚上到早上的7点,每小时的每一分钟都重启apache,如果是想达到每小时才重启的话,前面的分钟段,可以设置为0或者30之类的 5)服务器时间同步:系统每5分钟同步一次时间 [[email protected] ~]# crontab -l */5 * * * * /sbin/ntpdate time.windows.com >/dev/dull 2&>1 |
9. crontab命令生产环境专业写法
例1:每一分钟打印一次自己的名字到/server/log/自己的名字命令的文件中。 答案: #print char task by oldboy for programmer A at 2010-12-12 */1 * * * * echo “oldboy” >>/server/log/oldboy.log 2>&1 例2:每周六、日上午9:00和下午14:00来老男孩linux运维实战培训中心学习(/server/script/oldboy.sh) 答案: #cron job for ett by oldboy 2010-12-12 00 09,14 * * 6,0 /bin/sh /server/script/oldboy.sh >/dev/null 2>&1 针对以上两生产例子说明: 1写定时任务要写清注释是个好习惯,比如什么人,什么时间,因为谁,做了什么事 2执行任务时可以省略用户,在执行脚本时,尽量带上/bin/sh,否则有可能因为脚本没有执行权限而无法执行 3需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,可以登录到普通用户下,然后设置,这里要注意不同用户的环境变量问题。 4定时任务命令的结尾最好加上>/dev/null 2>&1等内容,如果需要打印日志,可以追加到指定日志,不推荐留这种不专业的做法 如果定时任务不加>/dev/null 2>&1等命令设置,时间长了,可能会导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量磁盘空间inode节点。 5在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及屏幕输出的内容命令去掉,如果还需要,可定向到日志里。 |
10. crontab生产解决案例
案例1:No space left on device故障1
在设置crontab时,提示No space left on device。用df –k检查还有空间,用df –i显示/var已占用100%,如果inode耗尽,则系统上下将不能创建文件。
在/var/spool/clientmqueue/下有超多的文件ls半天没反应,用rm -fr *会自动跳出root,然后用xargs来配合解决。cd /var/spool/clientmqueue&& ls |xargs rm –f
最后清理了该目录的内容。当然,如果文件数超多,执行ls |xargs rm –f也会长时间无反应,此时也可以直接cd /var/spool/&&rm –rf clientmqueue,然后mkdir clientmqueque && chmod 770 clientmqueue &&chown smmsp,smmsp -R /var/spool/clientmqueue。
原因分析:系统中,cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就会产生这些文件。
解决办法:开启邮件服务,并将crontab里面的命令后面加上>/dev/null 2>&1,在做定时脚本时,把屏幕输出定向到日志中。
案例2:No space left on device故障2
(1) when you create a new directory of file,system will say :No space left on device
[[email protected] /var]#mkdir ett Mkdir:cannot create directory ett’:No space left on device |
(2) when create crontab for account ett,you will receive error information as follows;
Crotab:installing new crontab Cron/tmp.6655:No space left on device Crontab:edits left in /tmp/crontab.6655 |
解决过程 1检查分区使用率,df -h 2检查/var/lock下的文件,删除/var/lock/subsys/nfx,touch /var/ett,成功创建文件,删除/var/ett 3发现删除/var/lock下的任意一个文件后,都可以成功创建一个文件,再创建就会失败。 4将检查扩大到/var/下的其他目录 5怀疑分区/var/de inode用尽导致上述问题,检查inode使用率 6分区/var/没有配置quota 7发现/var/spool/clientmqueue下面有太多的文件,由于系统的邮件服务配置有问题,导致系统发出的邮件堆积在队列目录中,占用大量的inode节点。 处理方法:确认/var/spool/clientmqueue下的文件已经无用,删除之,如果文件数量太大,无法使用rm -f * 直接删除,可以选择ls |xargs rm -f 或者直接删除上级目录,然后重建该目录,并赋予正确的属主和权限。 最好的解决办法是重新设置系统邮件,使其能正常发送或找到发邮件的源头,如本文的crontab任务。 结论:分区/var/的 inode全部用尽,free inode为0,导致无法创建新的文件或目录,以后遇到类似的问题要注意用df -li检查inode的使用情况。 |
11. 生产场景如何调试crontab定时任务
|
12. 定时任务生产问题8条箴言
|
13. 定时清理垃圾文件
crontab -l |tail -2 #del clientmqueue files by oldboy at 2010-09-26 00 00 * * 0 /bin/bash /server/scripts/del_sys_file.sh > /dev/null 2>&1 cat /server/scripts/del_sys_file.sh find /var/spool/clientmqueue/ -type f | xargs rm -f |
14. crond章节重点
1) 用户使用crontab -e自定义定时任务项目,分为六段,[分、时、日、月、周、指令]。
2) 系统的/etc/crontab定时任务项目分为7段,[分、时、日、月、周、用户、指令]。
3) crontab定时任务的5个生产基本要领和7点调试技巧,尤其是学会看服务日志来调试
4) 生产环境使用crontab定时任务要注意的8点箴言
5) 重视生产的案例及通过案例为载体来学习巩固技术知识