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。

下一篇:系统资源监控命令。