Linux cron的几点总结

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

Linux crontab

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

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

    root
    zhangsan
    
  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没有正常执行,可以考虑一下:
    • 脚本是否有错误,导致定期执行时中断
    • 脚本是否有使用相对路径,应该尽可能避免
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,cron表达式是用于定期执行任务的一种方式。cron表达式是一个由空格分隔的字符串,通常由5个或6个域组成,每个域表示一个时间单位。域之间的顺序是:秒、分钟、小时、日、月、(可选)。下面是一些cron表达式的示例: - 每天晚上1点调用/home/testuser/test.sh:0 1 * * * /home/testuser/test.sh - 每10分钟调用一次/home/testuser/test.sh:*/10 * * * * /home/testuser/test.sh - 每晚的21:30重启apache:30 21 * * * /usr/local/etc/rc.d/lighttpd restart - 在每天18:00至23:00之间每隔30分钟重启apache:0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart - 每月1、10、22日的4:45重启apache:45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart - 每周六、周日的1:10重启apache:10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 其中,各个域的取值范围如下: - 秒:0-59 - 分钟:0-59 - 小时:0-23 - 日:1-31 - 月:1-12 - 星期几:0-7(其中0和7都表示星期日) 可以使用星号(*)来代表任意时刻,逗号(,)来表示时间点的分隔,中划线(-)来表示时间段的范围,斜线(/)来表示时间的间隔。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [cron表达式 详解](https://blog.csdn.net/xijinno1/article/details/129741457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Linux Cron 表达式](https://blog.csdn.net/OiteBody/article/details/86241651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Linux定时任务-Cron表达式详解](https://blog.csdn.net/longgeaisisi/article/details/90400969)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值