定时任务 crontab:自动备份与脚本调度
用 crontab 让服务器在固定时间自动跑脚本,把每天的数据库备份、日志清理交给系统。
服务器上很多重复工作(每天备份、定时清理、周期性拉取数据)都不该靠人手动执行。Linux 的 cron 就是干这个的:你写好时间和命令,它到点自动运行。
crontab 是什么
cron 是常驻的定时调度服务,crontab 是它的任务清单。每个用户都有自己的一份清单,里面每行是一条任务:前面五段指定"什么时候",后面一段是"跑什么命令"。
编辑与查看
crontab -e # 编辑当前用户的任务表(首次会让你选编辑器,选 nano 最简单)
crontab -l # 查看已有任务
crontab -r # 删除全部任务(慎用)
保存退出后,cron 会立即生效,不需要重启。
五个时间字段
每条任务前面是 5 个字段,顺序固定:
# ┌── 分钟 (0-59)
# │ ┌── 小时 (0-23)
# │ │ ┌── 日 (1-31)
# │ │ │ ┌── 月 (1-12)
# │ │ │ │ ┌── 星期 (0-7,0 和 7 都是周日)
# │ │ │ │ │
# * * * * * 要执行的命令
| 字段 | 含义 | 取值 | |---|---|---| | 分钟 | 第几分钟 | 0-59 | | 小时 | 第几点(24 小时制) | 0-23 | | 日 | 每月第几天 | 1-31 | | 月 | 第几月 | 1-12 | | 星期 | 周几 | 0-7 |
常用符号: 表示"每个";/10 表示"每隔 10";1,15 表示"第 1 和第 15";1-5 表示"1 到 5"。
实用例子
# 每天凌晨 3 点备份数据库,并把日志写进文件
0 3 * * * /usr/bin/mysqldump -u root -pYOURPASS mydb > /home/backup/mydb.sql 2>> /home/backup/cron.log
# 每 10 分钟执行一次健康检查脚本
*/10 * * * * /home/user/scripts/healthcheck.sh
# 每周日凌晨 2:30 清理临时目录
30 2 * * 0 rm -rf /tmp/cache/*
# 每月 1 号 0 点归档日志
0 0 1 * * /home/user/scripts/archive.sh
> 文件 覆盖写、>> 文件 追加写;2>> 把错误信息也收进日志,出问题时方便排查。
常见坑
- 要用绝对路径。 cron 环境和你登录的终端不同,cd、命令、脚本、备份文件都写全路径,别用 或相对路径。
- 环境变量很少。 cron 的 PATH 很短,node、python、mysqldump 等最好写成 /usr/bin/xxx;需要变量就在 crontab 顶部自己设,或在脚本里 source /.bashrc。
- 脚本要有执行权限: chmod +x script.sh。
- 务必留日志。 默认输出会丢失(或发本地邮件),加 >> /path/log 2>&1 才能看到到底跑没跑、报了什么错。
- 注意时区。 用 timedatectl 确认服务器时区,否则"凌晨 3 点"可能不是你以为的那个 3 点。
小结
crontab 的核心就是"五段时间 + 一条命令"。记住三点就能用好:字段顺序别记错、命令一律写绝对路径、输出重定向到日志。先用 crontab -e 加一条每 10 分钟的测试任务验证生效,再换成真正的备份计划,你的服务器就能自己照看自己了。