• linux crontab 定时任务详解


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    linux crontab 定时任务详解

    img

    前言

    正如闹钟对于日常生活的重要性一样,linux crontab 定时任务在开发中是必不可少的工具,诸如:每六个月清理一次日志,每天凌晨 12.00 重启服务等多种场景,都可以用 crontab 搞定。

    本文测试环境为 Ubuntu 22.04,某些细节不同的发行版可能有所差异,以各自手册为主。

    快速开始

    友情提示:在你的 .bashrc 文件中设置你常用的编辑器,比如: export EDITOR=vim,后续编辑的时候就不会弹出其他陌生的编辑器了。

    输入 crontab -e 并在文件末尾输入 */2 * * * * date >> /tmp/test-crontab.txt(后续会对这句话的含义做解释,此处先不用纠结),多等待几分钟后看看 /tmp 目录下生成的 test-crontab.txt 文件中的内容。

    img

    如上图所示,我们实现了每隔 2 分钟将当前日期追加到文件中的功能,一行命令一句表达式,crontab 的使用就是这么简单。

    在详细解释 crontab 表达式的具体含义之前,来看看其他的操作。

    crontab -l 查看当前运行的定时任务

    crontab -r 删除所有的定时任务

    注意:如果要停止某个定时任务,只需要 -e 的时候使用 # 将其注释即可。

    表达式

    .---------------- 分 minute (0 - 59)
    |  .------------- 时 hour (0 - 23)
    |  |  .---------- 天 day of month (1 - 31)
    |  |  |  .------- 月 month (1 - 12) OR jan,feb,mar,apr ...
    |  |  |  |  .---- 周 day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    |  |  |  |  |
    m h dom mon dow
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    特殊的取值

    * 所有,例如对于 minute 来说,* 等价于 0-59
    
    , 数组,例如 1,3,5
    
    - 段,例如 1-3 等价于 1,2,3
    
    / 间隔,例如对于 minute 来说,*/2 代表每 2 分钟
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    它们也可以结合在一起使用,如:1-5/2

    特殊的写法

    除了上面的表达式之外,还有类似编程语法中的语法糖,更加直白一点

    @reboot        Run once, at startup.
    @yearly        Run once a year, "0 0 1 1 *".
    @annually      (same as @yearly)
    @monthly       Run once a month, "0 0 1 * *".
    @weekly        Run once a week, "0 0 * * 0".
    @daily         Run once a day, "0 0 * * *".
    @midnight      (same as @daily)
    @hourly        Run once an hour, "0 * * * *".
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    举个例子

    说的再多,不如实战几个例子来得更加清晰易懂

    5 0 * * * 每天的 00:05 点

    15 14 1 * * 每个月 1 号的 14:15

    0 22 * * 1-5 每周从周一到周五 22:00

    虽然 crontab 不复杂,但是也没那么直白,需要大脑稍微翻译一下,并且 crontab 不太方便测试任务什么时间运行,此时借助在线的 https://crontab.guru/ 工具,我们就能写出正确的表达式,并且点击 next 还可以看到任务运行的时间点。

    img

    多用户管理

    linux 系统是一个多用户系统,crontab 也支持多用户,默认使用当前用户,使用 crontab -u username 便可以指定其他用户。

    比如 sudo crontab -u root -e 便可编辑 root 用户的配置,不同用户的配置保存在 /var/spool/cron/crontabs 目录下。

    img

    除此之外,/etc/cron.allow 文件控制哪些用户可以使用 crontab,/etc/cron.deny 文件控制哪些用户不可以使用 crontab。

    系统级的 crontab

    /etc/crontab 文件中设置的是一些系统级的定时任务,其中每行都多了一个执行用户,并且直接编辑该文件而不是使用 crontab 命令来管理。

    img

    问题排查

    所有的定时任务都是由 cron 守护进程来负责调度执行的,如果任务未按照你的预期运行,可以通过 systemctl status cron.service 查看守护进程是否 running。

    下图的日志还可以看到由于缺少用户名导致语法错误,一个定时任务被忽略,使用 journalctl -u cron.service 还可以查看更多的日志信息。

    img

    参考

    man 1 crontab

    man 5 crontab

    man 8 cron

    如何在 man page 上做笔记

    crontab 表达式在线测试

    最后

    本文永久地址:https://github.com/yahuian/blog/blob/master/linux/crontab/README.md

    读者有任何疑问,欢迎在 issues 区留言讨论~

  • 相关阅读:
    leetCode 214.最短回文串 + KMP
    Spring的后处理器
    XMLDecoder解析流程分析
    面试题解:基于 ZooKeeper 的分布式锁实现原理是什么?和Reids做分布式锁的区别?
    tex转markdown
    21.5 CSS 网页布局方式
    【Oracle】数据库账号频繁被锁问题解决
    【笔记】echarts图表的缩放和鼠标滚动冲突的处理解决方案
    栈的基本操作
    net自动排课系统完整源码(适合智慧校园)
  • 原文地址:https://blog.csdn.net/m0_56069948/article/details/125476800