实战
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 服务