Linux 定时任务 crontab 入门:让服务器自己干活
【摘要】 用 crontab 把备份、清理、巡检等重复工作交给服务器:讲清 5 个时间字段的读法、每天凌晨备份的完整例子,以及路径、百分号转义等新手最容易踩的坑。
很多重复工作不需要人天天守着:每天凌晨备份数据库、每周清理一次日志、每小时检查一次服务状态,这些都可以用 Linux 的 crontab 交给服务器自己做。本文用最短的篇幅讲清楚 crontab 的写法和避坑点。
一、crontab 是什么
cron 是 Linux 的定时任务服务,crontab 是管理个人定时任务的命令。系统启动后 cron 会一直在后台运行,每分钟检查一次有没有到期的任务,到点就执行。
查看当前用户的任务:
crontab -l
编辑任务:
crontab -e
删除全部任务(危险,执行前请确认):
crontab -r
二、时间字段怎么读
一行任务由 5 个时间字段加 1 条命令组成:
分 时 日 月 周 命令
例如:
0 2 * * * /home/user/backup.sh
意思是每天凌晨 2 点 0 分执行备份脚本。星号表示每:第一个星号是每分钟,第二个是每小时,以此类推。
常用写法:
*/10 * * * * /home/user/check.sh # 每 10 分钟一次
0 0 * * 0 /home/user/weekly.sh # 每周日 0 点一次
30 8 * * 1-5 /home/user/work.sh # 周一到周五早上 8 点 30 分
0 0 1 * * /home/user/monthly.sh # 每月 1 号 0 点一次
注意:日和周同时写具体值时,cron 是或的关系,两个条件满足其一就会执行,新手很容易在这里踩坑。
三、一个能跑的例子:每天备份
先写一个简单的备份脚本:
#!/bin/bash
DATE=$(date +%F)
mysqldump -u root -p'密码请用更安全的方式保存' mydb > /backup/mydb-$DATE.sql
find /backup -name '*.sql' -mtime +7 -delete
给脚本执行权限,再加到 crontab:
chmod +x /home/user/backup.sh
crontab -e
0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
把输出重定向到日志文件很重要,否则出错了你都不知道任务到底跑没跑。
四、新手最容易踩的四个坑
- 环境变量不一样。cron 的 PATH 很小,命令尽量写绝对路径,例如 /usr/bin/python3 而不是 python3,脚本开头也要写好 PATH。
- 百分号要转义。在 crontab 里 % 有特殊含义,命令中用到 date +%F 时要写成 date +%F,或者把逻辑放进脚本文件里。
- 权限和目录。备份目录要提前建好,脚本的属主和 cron 用户要一致,否则会出现手动能跑、定时跑不起来的情况。
- 先小步验证。不要一上来就写每天一次,先用每分钟一次验证:
* * * * * echo "cron ok $(date)" >> /tmp/cron-test.log
看到日志正常滚动,再改回真正的时间。
五、检查任务有没有执行
除了看自己的业务日志,还可以看系统日志:
# 不同发行版位置可能不同
sudo grep CRON /var/log/syslog
sudo grep CRON /var/log/cron
systemctl status cron
如果日志里有执行记录但业务没生效,多半是路径、权限或环境变量的问题,按上面第四节逐项排查。
结语
crontab 的语法只有 5 个字段,难的不是背格式,而是养成习惯:命令写绝对路径、输出写进日志、先用短周期验证一次。把这三点做到,备份、清理、巡检这些重复活就可以放心交给服务器了。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)