Linux cron的几点总结

来源:互联网 发布:苹果淘宝打不开 编辑:程序博客网 时间:2024/04/30 19:24

最近搞了几个crontab的定时任务,查阅了些资料,也遇到一些问题,记录总结一下。

Linux crontab

Linux每个用户都有自己的crontab计划,可以使用 contab -u username -l 查询对应用户下的定时任务,但是这个命令的使用有权限限制:

  1. linux下有某些文件说明了对用户的权限设置,这些文件的格式是每个用户的用户名单独一行,没有前置和后置的空格,其他格式将会被忽略,像下面这样:

    rootzhangsan
  2. 如果 /usr/lib/cron/cron.allow 文件存在,当前用户必须在这个文件中才可以使用这个命令;

  3. 如果 /usr/lib/cron/corn.allow 文件不存在,但是 /usr/lib/cron/corn.deny 存在,那么当前用户不能在 cron.deny这个文件中存在;
  4. 如果 /usr/lib/cron/cron.allow 和 /usr/lib/cron/cron.deny 两个文件都不存在,那么将取决于参数的配置,要么只能管理员使用这个命令,要么所有的人都可以使用这个命令;

crontab 命令

命令参数

  • -u 指定了被查询用户的用户名,如果没有指定的话,将会检查当前用户的crontab
  • -l 将当期的crontab输出到标准输出
  • -r 将当前的crontab删除
  • -e 使用选定的编辑器编辑当前的crontab

crontab 安装

基本格式

使用crontab -e进行安装,每一行的格式是的格式是:

m h dom mon dow  command

分别对应分时日月周,每个字段可用范围:

m: 0~59 每分钟使用 * 或者 */1

h: 0~23

dom: 1~31

mon: 1~12 名字也可以,大小写无关

dow: 0~7 ,0和7都代表代表周日,可以使用星期的英文名来定义使用了前三个字母, mon,tue,wed,thu,fri,sat,sun

另外一些特殊的字符串也会出现在定义中:

  • @reboot 只在启动时运行一次
  • @yearly 一年仅仅运行一次 ‘0 0 1 1 *’
  • @annually 和@yearly一样
  • @monthly 每月执行一次
  • @weekly 每周执行一次
  • @daily 每天执行一次
  • @midnight 和@daily类似
  • @hourly 每小时运行一次

每个属性域的设置形式

关于各个字段值的可选范围及形式,如下:

  • 当值为 * 时 表明每个该时间满足条件 如放在 m上表示每分钟都满足,放在h上表明每小时都满足条件
  • 范围(Ranges)当值为 a-b时,表明每a-b的该时间满足条件, 在m上表示每a-b分钟满足条件,在h上表明每a-b时满足条件
  • 步进(Steps)当值为 */n时,表示每n个该时间满足条件,在m上表示每n分钟满足条件,在h上表明每n时满足条件
  • 列表(Lists)当值为 a,b,c,d…时,表示每到a,b,c,d就满足条件,在m上表示每到a,b,c,d分时候满足条件,在h上表明每到a,b,c,d时满足条件

通过以上几点就可以进行简单的设置了,但是简单的定点定时还好,但是如果要求比较复杂,例如每周五晚上的八点到十点之间每两分钟执行该如何解决,上述的简单设置就不能满足要求了。

更复杂的属性域设置

前面的5列其实是一个多条件的组合,当这些条件满足就会执行后面的命令,

对于每一个属性域来说,有*,Ranges,Steps和Lists四种基本形式,这些属性域还可以进行再组合,形成更加复杂的定时任务设置,组合大概两种形式,同一层级和不同层级的组合:

  1. 同一层级 以分钟为例,
    1. Ranges和Steps,20-30/2 在20到30分内每隔2分钟满足条件。
    2. Ranges和Lists,1-3,7-9 表示为1~3分和7~9分。但是这种好像不被ATT和BSD的cron接受。
  2. 不同层级 我认为属性的是有优先级判断的,先从时间范围的高层级条件查询,mon > dow = dom > h > m ,每层条件通过才会执行后面的命令。特别的由于对于某一天这样的时间域的限制可以通过两个属性来设置dom和dow,那么当这两个属性都被设置(也就是都不为的时候),cron会在满足两个条件的时候都执行。如官方例子:30 4 1,15 5 会在每月的1日4:30和15日4:30以周五的4:30执行后面的执行命令。

命令部分:

  1. 可以使用环境变量,一些变量是通过cron daemon设定的,LOGNAME和HOME来自于/etc/passwd文件的当前crontab属主的那一行
  2. cron的命令会被 /bin/sh 执行或者被在cronfile中的变量 SHELL 所定义的shell去执行。 命令部分要么到整行结束要么遇到 % 作为结束,所以在cron中的 % 要注意转义。

其他

  1. 和Quartz区别
    linux的crontab组成和Quartz的组成不太相似,Linux crontab 最小到分钟最大到月份,而Quartz还有最小到秒最大到年,所以Quartz多出来两列
  2. 执行失败原因
    有时发现创建的crontab没有正常执行,可以考虑一下:
    • 脚本是否有错误,导致定期执行时中断
    • 脚本是否有使用相对路径,应该尽可能避免