Linux crontab 定时任务入门:让脚本每天自动跑
你是不是也有这样的需求:数据库每天凌晨备份一次、日志每天早上清理一次、某个脚本每五分钟同步一份数据。总不能自己定闹钟半夜爬起来敲命令吧?crontab 就是 Linux 里干这事的"自动闹钟"。
一、crontab 是什么
crontab 是 Linux/Unix 系统内置的定时任务工具。每个用户都可以维护自己的一份任务清单(叫"crontab 文件"),系统里的 cron 守护进程会每分钟检查一遍清单,到点了就自动执行对应的命令。它不需要额外安装,绝大多数发行版都自带,是运维自动化的入门必修课。
二、三个最常用的命令
crontab -e # 编辑我的定时任务(首次会让你选编辑器,选 vim 即可)
crontab -l # 列出我当前的所有任务
crontab -r # 删除我的全部任务(慎用!没有二次确认)
注意:crontab 是按用户隔离的。root 用 crontab -e 写的任务和普通用户写的互不干扰。
三、五个时间字段
每条任务一行,格式是"五个时间字段 + 要执行的命令":
分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 周(0-7, 0和7都是周日) 命令
几个高频写法:
| 表达式 | 含义 |
|---|---|
0 2 * * * |
每天凌晨 2:00 |
*/5 * * * * |
每 5 分钟 |
0 9-18 * * * |
每天 9 点到 18 点的整点 |
0 0 * * 1 |
每周一零点 |
30 8 1 * * |
每月 1 号早上 8:30 |
四、实战:每天凌晨备份数据库
先写一个备份脚本 /home/dev/backup.sh:
#!/bin/bash
mysqldump -u root -p'你的密码' mydb > /backup/mydb_$(date +\%Y\%m\%d).sql
find /backup -name "mydb_*.sql" -mtime +7 -delete # 只保留最近 7 天
然后 crontab -e 加一行:
0 2 * * * /home/dev/backup.sh >> /home/dev/backup.log 2>&1
这行的意思是:每天凌晨 2 点执行备份脚本,标准输出和错误输出都追加写进 backup.log。给任务配日志是个好习惯,不然任务没跑成功你都不知道。
五、新手必踩的四个坑
1. 百分号要转义。 在 crontab 里 % 是特殊字符(表示换行),所以命令里的日期格式必须写成 %Y%m%d,否则日期部分会出错。
2. 环境变量和你想的不一样。 cron 执行任务时用的是精简版环境变量,PATH 里往往没有 /usr/local/bin。最稳的办法是命令一律写绝对路径,或者在脚本开头自己 export PATH。
3. 改完不生效? 用 crontab -l 确认保存成功。另外检查 cron 服务是否在跑:systemctl status crond(Debian/Ubuntu 系统叫 cron)。
4. 周和日"同时"指定是"或"不是"与"。 0 0 1 * 1 表示"每月 1 号零点或每个周一零点",不是"既是 1 号又是周一才执行"。想要"且"的逻辑,把判断写进脚本里。
六、小结
crontab 的精髓就一句话:把"到点要做的事"交给系统,而不是靠人。掌握 crontab -e/-l、五个时间字段、绝对路径和日志重定向这几点,日常 90% 的定时需求都能覆盖了。更复杂的场景(任务依赖、失败重试、分布式调度)再考虑 Jenkins、Airflow 这类专业工具不迟。
- 点赞
- 收藏
- 关注作者
评论(0)