Linux课程笔记 Crond介绍

1. 定时任务比较及cron语法

Linux的任务调度可以分为两类:

  1. 系统自身执行的任务
  2. 用户执行的工作

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分钟同步一次时间

[root@test2 ~]# 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

[ett@linux /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定时任务

  1. 在调试时,把任务执行频率调大一点,如:每分钟、每5分钟执行一次;
  2. 用正确的执行任务时间,设置完成后,可以修改下系统当前时间;
  3. 在脚本中加入日志输出,然后把输出打印到指定的日志中,然后观察日志内容,看是否执行正确;
  4. 注意:*/1  *  *  *  *  echo “==” >> /tmp/oldboy.log  >/dev/null  2>&1这种隐蔽的无法正确执行的任务配置;
  5. 执行脚本中>>或者>后的文件名要加上绝对路径。
  6. 注意环境变量导致的定时任务故障,比如运行java程序的时候,环境变量要在脚本中重新export一下。
  1. 通过定时任务日志查看调试定时任务

12. 定时任务生产问题8条箴言

  1. 环境变量问题,典型的是如java程序运行案例
  2. 任务路径问题,脚本要用绝对路径
  3. 脚本权限问题,最好带上/bin/bash,防止忘了为脚本赋予执行的权限带来问题
  4. 时间变量问题,%号在crontab中被认为是newline,需要用转义,crontab中有“date +%Y%m%d”,必须替换为“date +\%Y\%m\%d”,但写在脚本中就不需要了,这也是老师推荐用脚本文件的原因之一。
  5. >/dev/null 2>&1问题
  6. 定时任务加注释
  7. 使用脚本程序代替命令
  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) 重视生产的案例及通过案例为载体来学习巩固技术知识

原文地址:https://www.cnblogs.com/fengze/p/6752488.html