实战

crontab -e               # 编辑自己的
crontab -l               # 看自己的
crontab -r               # 删自己的(小心)
sudo crontab -e -u alice # 编辑 alice 的

时间格式

* * * * * command
│ │ │ │ │
│ │ │ │ └── 周几(0-7,0 和 7 都是周日)
│ │ │ └──── 月(1-12)
│ │ └────── 日(1-31)
│ └──────── 时(0-23)
└────────── 分(0-59)

常用例子

* * * * *           每分钟(测试用)
0 * * * *           每小时整点
0 3 * * *           每天凌晨 3 点
0 9 * * 1           每周一上午 9 点
0 0 1 * *           每月 1 号
*/5 * * * *         每 5 分钟
0 9-17 * * 1-5      工作日 9-17 点每小时
0 0,6,12,18 * * *   每天 4 个时段

不会算?查 crontab.guru 在线翻译。

系统级 cron

/etc/crontab           主系统 crontab
/etc/cron.hourly/      每小时
/etc/cron.daily/       每天
/etc/cron.weekly/      每周
/etc/cron.monthly/     每月
/etc/cron.d/           自定义文件

把脚本扔到 /etc/cron.daily/ 自动每天跑——不用记 cron 语法

经典脚本:每日备份

/etc/cron.d/db-backup:

0 3 * * * wadely /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

⚠ 3 个常见坑

1. 环境变量不一样

cron 跑的 shell 没有你登录 shell 的环境变量

# ❌ 找不到命令
0 3 * * * mybinary

# ✓ 用全路径
0 3 * * * /usr/local/bin/mybinary

或脚本头部:

#!/bin/bash
source /etc/profile

2. 输出 / 错误丢失

cron 默认把输出通过本地邮件发——多数服务器没配邮件 = 输出消失。

# 收集到日志
0 3 * * * /backup.sh >> /var/log/backup.log 2>&1

3. % 是特殊字符

crontab 里 % 表示换行,要转义:

0 3 * * * date +\%F

调试

# 临时设为每分钟看是否触发
* * * * * /myscript.sh >> /tmp/cron.log 2>&1

# 查 cron 日志
grep CRON /var/log/syslog | tail
journalctl -u cron --since today

进阶:systemd timer

systemd 也有定时器——比 cron 强(依赖管理 / 日志一体化),见 linux/22-crontab

  • crontab -r 直接删除所有任务没确认——-i 加问确认
  • root 的 crontab 在 /var/spool/cron/crontabs/root——别直接编辑那里,永远 crontab -e
  • 用户在容器 / chroot 内的 cron 可能不工作——容器场景用 systemd timer 或独立的 cron 服务