当前位置:首页>Linux>Linux定时任务工具

Linux定时任务工具

  • 2026-08-23 05:18:35
Linux定时任务工具

Linux 发行版“开箱即用”的定时任务工具其实就俩:

  1. cron(绝大多数场景说的“系统定时任务”就是它)
  2. systemd timer(新一代,依赖 systemd,不需要额外安装)

下面把用法、文件位置、常见坑一次讲清,照着抄就能跑。


一、传统 cron(vixie-cron / cronie)

  1. 服务状态

    systemctl status crond          # RHEL/CentOS/Alma/Rocky
    systemctl status cron           # Debian/Ubuntu
  2. 给当前用户加任务

    crontab -e                      # 编辑(第一次会提示选编辑器)
    crontab -l                      # 查看
    crontab -r                      # 全部清掉
  3. 语法

    # 分 时 日 月 周   命令(绝对路径!)
    0  2  *  *  *    /usr/local/bin/backup.sh
    */5 * * * *      /usr/bin/python3 /home/pi/dht22.py >>/var/log/dht22.log 2>&1

    特殊字符串:
    @reboot  /usr/local/bin/start.sh   # 开机执行一次
    @daily   /usr/bin/certbot renew    # 每天 00:00 跑一次

  4. 系统级任务(不用登录就能跑)
    把脚本文件扔进 /etc/cron.hourly|daily|weekly|monthly/ 并给可执行权限即可,执行顺序按文件名排序。
    或者手动写 /etc/crontab(多一个“用户名”字段):

    # 分 时 日 月 周  用户   命令
    0  3  *  *  *   root   /opt/clean-tmp.sh
  5. 日志 & 排错

    • Debian/Ubuntu 默认把 cron 日志打到 /var/log/syslog
    • RHEL 系列 /var/log/cron
      如果脚本没跑,先查:
      a) 服务有没有起来
      b) 日志里有没有 /usr/bin/bash: Command not found 之类路径错误
      c) 脚本里是否用了相对路径、% 没转义、环境变量(PATH)缺失

二、systemd timer(“原生自带”只要系统用 systemd)

  1. 两个文件成对出现:
    *.timer 定义“什么时候触发”
    *.service 定义“触发后干什么”

  2. 例子:每天 04:30 备份 /etc
    /etc/systemd/system/etc-backup.service

    [Unit]
    Description=Backup /etc

    [Service]
    Type=oneshot
    ExecStart=/bin/bash -c '/usr/bin/rsync -a --delete /etc /backup/etc-$(date +%F)'

    /etc/systemd/system/etc-backup.timer

    [Unit]
    Description=Run etc-backup daily

    [Timer]
    OnCalendar=*-*-* 04:30:00
    Persistent=true          # 如果关机错过了,开机后补跑
    [Install]
    WantedBy=timers.target
  3. 启用

    systemctl daemon-reload
    systemctl enable --now etc-backup.timer   # 立即生效并开机自启
  4. 查看

    systemctl list-timers --all               # 类似 crontab -l
    journalctl -u etc-backup.service -f       # 看日志
  5. 语法补充
    OnCalendar= 支持很多写法:

    OnCalendar=Mon *-*-* 02:00              # 每周一 02:00
    OnCalendar=*-*-01 03:00                 # 每月 1 号 03:00
    OnCalendar=2025-12-24 18:00             # 精确到某一刻
    OnBootSec=30min                         # 开机后 30 分钟
    OnUnitActiveSec=1h                      # 上次运行后 1 小时

三、怎么选

  • 只要简单、可移植、 distro 通用 → cron
  • 需要“错过执行后补跑”、依赖 systemd 的高级特性(CGroups、日志集中、秒级精度、CPU/IO 带宽限制)、或者已经在用 systemd 单元 → timer

最新文章

随机文章