定时任务总靠手动跑?crontab 一次讲清
定时任务总靠手动跑?crontab 一次讲清
每天凌晨手动备份数据库、每周手动清理一次日志、每月手动重启一次服务——这些重复活,交给 crontab 就行。它是 Linux 自带的定时任务工具,学会 5 个字段的写法,就能让服务器自己按时干活。
一、crontab 的时间怎么写
一条定时任务长这样:
30 2 * * * /home/opc/backup.sh >> /var/log/backup.log 2>&1
前面 5 个字段依次是:分 时 日 月 星期。上面这行意思是每天凌晨 2:30 执行一次备份脚本,输出追加到日志里。
几个常用写法:
0 9 * * 1-5 /home/opc/report.sh # 工作日早上 9 点
*/10 * * * * /home/opc/health.sh # 每 10 分钟一次
0 0 1 * * /home/opc/monthly.sh # 每月 1 号零点
0 3 * * 0 /home/opc/clean-logs.sh # 每周日凌晨 3 点清理日志
*/10 是"每隔 10 分钟",1-5 是"周一到周五",* 是"每一次都执行"。新手最容易写错的是把"日"和"星期"叠加——两者同时填时是"或"的关系,不是"与",尽量只填其中一个。
二、编辑与查看
crontab -e # 编辑当前用户的定时任务
crontab -l # 查看已有任务
crontab -r # 删除全部任务(慎用,没有确认提示)
编辑器默认可能是 vi,不习惯的话可以先设一个:
export EDITOR=nano
crontab -e
三、三个新手必踩的坑
坑一:环境变量不一样。 crontab 里执行的命令环境变量很少,PATH 里常常没有 /usr/local/bin。脚本里写绝对路径最稳妥,或者在脚本开头加一行 source ~/.bashrc。
坑二:相对路径失效。 定时任务的工作目录是用户家目录,脚本里写 ./data 大概率找不到文件。统一用绝对路径,日志也写绝对路径。
坑三:没输出就不知道跑没跑。 每条任务都把输出重定向到日志文件:
30 2 * * * /home/opc/backup.sh >> /var/log/backup.log 2>&1
2>&1 是把错误输出也写进同一个日志。出了问题先看日志,别凭感觉猜。
四、一个真实可用的例子
每天凌晨备份 MySQL 并只保留最近 7 天:
30 2 * * * mysqldump -u root mydb | gzip > /backup/mydb-$(date +\%Y\%m\%d).sql.gz
0 3 * * * find /backup -name "*.sql.gz" -mtime +7 -delete
注意:crontab 里的 % 必须转义成 \%,否则会被当成换行符,这是很多人第一次写备份任务就翻车的原因。
五、怎么确认它真的在跑
grep CRON /var/log/syslog # Debian/Ubuntu 看系统日志
grep CRON /var/log/cron # CentOS/RHEL
看到对应时间点的 CRON 记录,说明调度器已经触发了任务。任务本身成没成功,再看你重定向的那个日志文件。
crontab 不难,难的是第一次写的时候不留坑:绝对路径、重定向日志、% 记得转义。这三点做到了,服务器就能替你把重复活干得稳稳当当。
- 点赞
- 收藏
- 关注作者
评论(0)