定时任务入门:让脚本自动执行
每天手动跑备份脚本?每小时检查一次服务状态?
太麻烦了,设置个定时任务让它自动跑。今天教你Linux下的定时任务crontab。
crontab基本用法
查看当前用户的定时任务:
crontab-l编辑定时任务:
crontab-e第一次会让你选编辑器,选nano比较简单。
时间格式
crontab的时间格式是5个字段:
分 时 日 月 周 命令每个字段的范围:
- 分:0-59
- 时:0-23
- 日:1-31
- 月:1-12
- 周:0-7(0和7都是周日)
举几个例子:
# 每天早上8点执行08* * * /root/scripts/backup.sh# 每小时的第30分钟执行30* * * * /root/scripts/check.sh# 每5分钟执行一次*/5 * * * * /root/scripts/monitor.sh# 每周一早上9点执行09* *1/root/scripts/weekly.sh# 每月1号凌晨2点执行021* * /root/scripts/monthly.sh# 每天凌晨2点和14点执行02,14* * * /root/scripts/twice.sh# 工作日(周一到周五)每天9点执行09* *1-5 /root/scripts/workday.sh常用时间写法
| 需求 | 写法 |
|---|---|
| 每分钟 | * * * * * |
| 每5分钟 | */5 * * * * |
| 每小时 | 0 * * * * |
| 每天凌晨0点 | 0 0 * * * |
| 每天凌晨2点 | 0 2 * * * |
| 每周日凌晨0点 | 0 0 * * 0 |
| 每月1号凌晨0点 | 0 0 1 * * |
完整例子
例子1:每天备份数据库
# 创建备份脚本cat>/root/scripts/backup_db.sh<<'EOF' #!/bin/bash DATE=$(date +%Y%m%d) mysqldump -u root -p123456 mydb > /backup/mydb_$DATE.sql find /backup -name "*.sql" -mtime +7 -delete EOFchmod+x /root/scripts/backup_db.sh# 添加定时任务crontab-e# 添加这行02* * * /root/scripts/backup_db.sh>>/var/log/backup.log2>&1例子2:每5分钟检查服务
# 检查脚本cat>/root/scripts/check_service.sh<<'EOF' #!/bin/bash if ! systemctl is-active --quiet nginx; then systemctl start nginx echo "$(date) nginx重启了" >> /var/log/service_check.log fi EOFchmod+x /root/scripts/check_service.sh# 定时任务*/5 * * * * /root/scripts/check_service.sh例子3:每天清理日志
# 定时任务03* * *find/var/log/app -name"*.log"-mtime +7 -delete注意事项
1. 要写绝对路径
crontab执行时环境变量可能不全,用绝对路径最安全:
# 不推荐02* * * backup.sh# 推荐02* * * /root/scripts/backup.sh2. 输出重定向
crontab默认会把输出发邮件,建议重定向到日志:
02* * * /root/scripts/backup.sh>>/var/log/backup.log2>&12>&1表示把错误输出也重定向到日志。
3. 不要忘记换行
crontab文件最后要有一个空行,不然最后一行可能不执行。
调试技巧
1. 先手动执行测试
/root/scripts/backup.sh确保脚本能正常运行。
2. 看执行日志
# 查看cron日志tail-f /var/log/cron# CentOStail-f /var/log/syslog# Ubuntu3. 检查邮件
如果没有重定向输出,cron会发邮件:
cat/var/spool/mail/root系统级定时任务
除了crontab -e,还可以把脚本放到这些目录:
/etc/cron.hourly/# 每小时执行/etc/cron.daily/# 每天执行/etc/cron.weekly/# 每周执行/etc/cron.monthly/# 每月执行直接把脚本放进去就行,不用写时间格式。
常见问题
Q:定时任务没执行?
- 检查cron服务:
systemctl status crond - 检查脚本权限:
chmod +x script.sh - 检查路径是否正确
- 看日志找原因
Q:脚本手动能跑,定时不行?
可能是环境变量问题,在脚本开头加:
#!/bin/bashsource/etc/profile远程管理定时任务
管理多台服务器的定时任务比较麻烦,我用星空组网把服务器都连起来,可以批量操作:
# 批量查看定时任务foripin10.26.1.{10..15};doecho"===$ip==="sshroot@$ip"crontab -l"done改完一台的定时任务,也能快速同步到其他机器。
小结
crontab格式:分 时 日 月 周 命令
常用写法:
- 每天2点:
0 2 * * * - 每5分钟:
*/5 * * * * - 每周一9点:
0 9 * * 1
注意事项:
- 用绝对路径
- 输出重定向到日志
- 文件末尾留空行
有问题评论区交流~