什么是crontab?
Cron是Linux定时任务守护进程,crontab是它的配置文件。简单说,可以设置”每天凌晨3点执行备份脚本”这种任务。
基本命令
1 2 3 4
| crontab -e crontab -l crontab -r crontab -u username -l
|
时间格式
Cron表达式由5个字段组成:
1 2 3 4 5 6 7
| * * * * * 命令 │ │ │ │ │ │ │ │ │ └─ 星期几(0-7,0和7都是周日) │ │ │ └─── 月份(1-12) │ │ └───── 日期(1-31) │ └─────── 小时(0-23) └───────── 分钟(0-59)
|
常用时间示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| * * * * * command
0 * * * * command
0 3 * * * command
0 8 * * 1 command
0 0 1 * * command
0 9 * * 1-5 command
*/15 * * * * command
0 */2 * * * command
0 9-18 * * * command
0 0 1 7 * command
|
创建定时任务
示例1:每天凌晨3点备份
- 编辑任务:
- 添加一行:
1
| 0 3 * * * /home/user/backup.sh
|
- 保存退出(
:wq)
示例2:每5分钟检查服务
1
| */5 * * * * /home/user/check_service.sh > /dev/null 2>&1
|
> /dev/null 2>&1 表示不输出任何信息。
示例3:每天删除30天前的日志
1
| 0 2 * * * find /var/log -name "*.log" -mtime +30 -delete
|
环境变量问题
Cron环境变量和终端不同,脚本可能找不到命令。
解决方法1:使用完整路径
1 2 3 4 5
| 0 3 * * * backup.sh
0 3 * * * /home/user/backup.sh
|
解决方法2:在脚本开头导出环境
1 2 3
| #!/bin/bash source ~/.bashrc
|
解决方法3:在crontab里设置PATH
1 2
| PATH=/usr/local/bin:/usr/bin:/bin 0 3 * * * /home/user/backup.sh
|
日志和调试
重定向输出
1 2 3 4 5
| 0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>> /var/log/backup_error.log
|
查看定时任务日志
1 2 3 4
| tail -f /var/log/cron
journalctl -u cron
|
实用技巧
技巧1:防止重复执行(文件锁)
1 2 3 4 5 6 7 8 9
| #!/bin/bash LOCKFILE=/tmp/backup.lock if [ -f "$LOCKFILE" ]; then echo "任务正在运行" exit 1 fi touch "$LOCKFILE"
rm "$LOCKFILE"
|
技巧2:执行成功后通知
1
| 0 3 * * * /home/user/backup.sh && echo "备份成功" | mail -s "通知" user@example.com
|
技巧3:任务执行时间记录
1
| 0 3 * * * echo "开始时间: $(date)" >> /var/log/backup.log && /home/user/backup.sh >> /var/log/backup.log 2>&1
|
常见问题
Q: 定时任务没执行?
A: 检查:
- 脚本路径是否正确
- 脚本是否有执行权限(
chmod +x)
- 环境变量是否完整
- 查看
/var/log/cron 日志
Q: 脚本可以手动执行但Cron不行?
A: 通常是环境变量问题,用完整路径或导出环境变量。
Q: 如何只执行一次?
A: 用 at 命令:
1
| echo "backup.sh" | at 03:00
|
用户的crontab位置
编辑的任务保存在:
系统级别任务在:
总结
crontab -e 编辑,crontab -l 查看
- 时间格式:
分 时 日 月 周
- 常用:
0 3 * * * 每天凌晨3点,*/5 * * * * 每5分钟
- 脚本用完整路径
- 输出重定向到日志文件便于调试
- 检查
/var/log/cron 排查问题
下一篇:系统监控(top/htop/ps)。