crontab是Linux下最常用的定时任务工具,没有之一。它的配置文件语法简单,但坑不少。这篇笔记直接记录我日常用的配置方法和踩过的坑。
基本语法
* * * * * command
五个星号分别代表:分钟(0-59)、小时(0-23)、日(1-31)、月(1-12)、星期(0-7,0和7都表示周日)。
每个字段可以写:
– 具体数字:`5 ` 表示每小时的第5分钟
– 通配符`*`:表示每个单位都执行
– 逗号分隔多个值:`1,15,30 ` 表示第1、15、30分钟
– 连字符表示范围:`9-17 ` 表示9点到17点之间的每小时
– `/`表示步长:`/5 *` 表示每5分钟
常用配置示例
每30分钟清理一次临时文件:
*/30 * * * * /usr/bin/find /tmp -type f -mtime +1 -delete
每天凌晨2点备份数据库:
0 2 * * * /usr/local/bin/mysql_backup.sh
每周一早上9点发送周报:
0 9 * * 1 /home/user/send_weekly_report.sh
每个月1号凌晨3点更新SSL证书:
0 3 1 * * /opt/scripts/renew_cert.sh
配置文件管理
不要直接编辑`/etc/crontab`。正确的做法是:
每个用户有自己的crontab文件:
crontab -e # 编辑当前用户的定时任务
crontab -l # 查看当前用户的定时任务
crontab -r # 删除当前用户的所有定时任务
系统级任务放在`/etc/cron.d/`目录下,文件名随意,但格式比用户crontab多一个用户字段:
*/5 * * * * root /usr/local/bin/check_disk.sh
环境变量陷阱
crontab执行命令时的环境变量和登录shell不一样。PATH只有`/usr/bin:/bin`,很多命令找不到。
解决方案:在脚本里手动设置PATH,或者用绝对路径:
# 错误的写法
0 3 * * * python3 /opt/scripts/backup.py # 可能找不到python3
# 正确的写法
0 3 * * * /usr/bin/python3 /opt/scripts/backup.py
或者直接在crontab文件顶部设置环境变量:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 3 * * * python3 /opt/scripts/backup.py
日志和调试
crontab执行结果默认通过邮件发送给用户。如果没配邮件,日志就丢了。
建议把输出重定向到日志文件:
*/10 * * * * /opt/scripts/monitor.sh >> /var/log/monitor.log 2>&1
`2>&1`是把标准错误也重定向到日志。调试时可以单独看错误输出:
*/10 * * * * /opt/scripts/monitor.sh 2>> /var/log/monitor_error.log
常见坑
1. 百分号`%`在crontab里是特殊字符,需要用反斜杠转义。比如`date +%Y%m%d`要写成`date +\%Y\%m\%d`
2. 脚本路径用绝对路径,不要用`~/script.sh`,因为crontab不解析`~`
3. 脚本里如果依赖其他文件,也写绝对路径。比如脚本里用`source config.cfg`,config.cfg也要写全路径
4. 注意时区。服务器默认是UTC,如果想让任务在本地时间执行,先检查`timedatectl`设置
5. 任务执行时间超过间隔会导致任务堆积。可以用flock加锁:
*/5 * * * * /usr/bin/flock -n /tmp/myapp.lock /opt/scripts/myapp.sh
实战:监控磁盘并发送告警
在雨云的一台服务器上,我配置了每10分钟检查磁盘使用率:
*/10 * * * * /usr/local/bin/disk_alert.sh >> /var/log/disk_alert.log 2>&1
disk_alert.sh内容:
#!/bin/bash
THRESHOLD=90
CURRENT=$(df / | grep / | awk '{ print $5 }' | sed 's/%//')
if [ "$CURRENT" -gt "$THRESHOLD" ]; then
echo "$(date): Disk usage is ${CURRENT}%" | mail -s "Disk Alert" admin@example.com
fi
注意脚本第一行要写shebang,并且给执行权限`chmod +x disk_alert.sh`。
验证配置是否生效
用这个命令可以测试crontab语法是否正确:
grep -v "^#" /var/spool/cron/crontabs/$(whoami) | crontab -
或者直接运行`crontab -l`看输出有没有语法错误提示。
检查cron服务状态:
systemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHEL
批量管理多台机器
如果有多台雨云服务器需要部署相同的定时任务,别一台台手动配。写个Ansible playbook或者直接用shell脚本批量下发:
#!/bin/bash
SERVERS="server1 server2 server3"
for server in $SERVERS; do
ssh root@$server "echo '0 2 * * * /usr/local/bin/cleanup.sh' | crontab -"
done
crontab就这点东西,记住绝对路径、环境变量、日志重定向这三个关键点,基本不会出问题。遇到任务没执行,先查`/var/log/syslog`或者`journalctl -u cron`看日志,大部分问题都能定位。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容