crontab 是什么
每个用户有自己的 crontab——一张时间表,到点自动跑命令。
crontab -e # 编辑自己的 crontab
crontab -l # 看自己的 crontab
crontab -r # 删自己的 crontab(小心)
sudo crontab -e -u alice # 编辑 alice 的
第一次 crontab -e 会让你选编辑器——选 vim 或 nano。
时间格式
* * * * * command
│ │ │ │ │
│ │ │ │ └── 周几(0-7,0 和 7 都是周日)
│ │ │ └──── 月(1-12)
│ │ └────── 日(1-31)
│ └──────── 时(0-23)
└────────── 分(0-59)
例子:
# 每分钟跑(测试用)
* * * * * /usr/local/bin/health-check.sh
# 每小时整点
0 * * * * /usr/local/bin/hourly.sh
# 每天凌晨 3 点
0 3 * * * /usr/local/bin/backup.sh
# 每周一上午 9 点
0 9 * * 1 /usr/local/bin/weekly-report.sh
# 每月 1 号
0 0 1 * * /usr/local/bin/monthly-cleanup.sh
# 每 5 分钟
*/5 * * * * /usr/local/bin/poll.sh
# 工作日(周一到五)9-17 点每小时
0 9-17 * * 1-5 /usr/local/bin/biz.sh
# 每天 0 点、6 点、12 点、18 点
0 0,6,12,18 * * * /usr/local/bin/sync.sh
记不住语法可以查 crontab.guru 在线翻译。
系统级 cron:/etc/cron.*
除了用户 crontab,还有系统级目录:
/etc/crontab 主系统 crontab
/etc/cron.hourly/ 每小时跑一次
/etc/cron.daily/ 每天跑一次
/etc/cron.weekly/ 每周跑一次
/etc/cron.monthly/ 每月跑一次
/etc/cron.d/ 自定义 cron 文件目录
把脚本扔到 /etc/cron.daily/ 自动每天跑——不用记 cron 语法。
实战脚本:每日数据库备份
/etc/cron.d/db-backup:
# 每天凌晨 3 点
0 3 * * * wadely /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
/usr/local/bin/backup.sh:
#!/bin/bash
set -e
DATE=$(date +%F)
mkdir -p /backups
# 1. 数据库导出
mysqldump -u root -p"$DB_PWD" mydb | gzip > /backups/db-$DATE.sql.gz
# 2. 上传到对象存储
rclone copy /backups r2:my-backup --include "*-$DATE.*"
# 3. 删 14 天前
find /backups -name "*.sql.gz" -mtime +14 -delete
sudo chmod +x /usr/local/bin/backup.sh
⚠ cron 的几个坑
1. 环境变量不同
cron 跑的 shell 没有你登录 shell 的环境变量。
# ❌ 可能找不到命令
0 3 * * * mybinary
# ✓ 用全路径
0 3 * * * /usr/local/bin/mybinary
或者脚本头部 source 环境:
#!/bin/bash
source /etc/profile
# ... 你的代码
2. 输出 / 错误丢失
默认 cron 把输出通过本地邮件发——多数服务器没配邮件 → 输出消失。
# 收集输出到日志
0 3 * * * /backup.sh >> /var/log/backup.log 2>&1
3. 用 % 要转义
crontab 里 % 是特殊字符(换行),用 \%:
0 3 * * * date +\%F
4. 调试技巧
临时改成 * * * * *(每分钟)看是否触发;不触发查 /var/log/syslog:
grep CRON /var/log/syslog | tail
进阶:systemd timer
systemd 也有定时器功能,比 cron 强(依赖管理、日志一体化):
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl enable --now backup.timer
systemctl list-timers
cron 简单够用 → 跨平台脚本用 cron; 需要日志 / 依赖 / 复杂调度 → 用 systemd timer。
下一篇:系统资源监控命令。