crontab
是 Linux/Unix 系统中用于设置定时任务的工具,可以让系统在指定时间自动执行脚本或命令。以下是 详细用法指南,包括基础语法、配置方法、调试技巧和实际示例。
一、基本语法
- crontab 文件格式
每个定时任务占一行,格式如下:
1 2 3 4 5 6 7
| * * * * * command_to_execute │ │ │ │ │ │ │ │ │ └── 星期几 (0-6, 0=周日) │ │ │ └──── 月份 (1-12) │ │ └────── 日 (1-31) │ └──────── 小时 (0-23) └────────── 分钟 (0-59)
|
- 特殊符号
符号 |
说明 |
示例 |
* |
任意值(每分钟/每小时等) |
* * * * * → 每分钟执行 |
, |
指定多个时间点 |
0,15,30 * * * * → 每小时的 0、15、30 分执行 |
- |
时间范围 |
0 9-17 * * * → 每天 9 点到 17 点整点执行 |
/ |
间隔时间 |
*/5 * * * * → 每 5 分钟执行 |
二、常用操作
- 编辑 crontab
(首次使用会提示选择编辑器,推荐 nano
或 vim
)
- 查看 crontab
- 删除 crontab
- 指定用户
三、实际示例
- 每天凌晨 4 点执行备份脚本
1
| 0 4 * * * /bin/bash /path/to/backup_script.sh
|
- 每小时的第 5 分钟执行
1
| 5 * * * * /usr/bin/python3 /path/to/script.py
|
- 每周一 8:30 发送邮件
1
| 30 8 * * 1 /usr/sbin/sendmail user@example.com < /tmp/report.txt
|
- 每 10 分钟检查服务
1
| */10 * * * * /usr/bin/systemctl check nginx
|
- 每月 1 号凌晨 3 点清理日志
1
| 0 3 1 * * /bin/rm -rf /var/log/nginx/*.log
|
四、环境变量问题
cron 默认环境与终端不同,可能导致脚本执行失败。解决方法:
- 指定完整路径
1
| 0 * * * * /usr/bin/curl https://example.com/api/ping
|
- 在 crontab 中加载环境
1 2 3 4
| SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 * * * * source ~/.bashrc && /path/to/script.sh
|
- 在脚本内设置环境
1 2 3
| #!/bin/bash export PATH=/usr/local/bin:$PATH
|
五、日志与调试
- 查看 cron 执行日志
1 2
| tail -f /var/log/syslog | grep cron tail -f /var/log/cron
|
- 重定向输出到文件
1
| 0 * * * * /path/to/script.sh >> /var/log/cron.log 2>&1
|
• >>
追加日志
• 2>&1
将错误输出和标准输出合并
- 测试 cron 任务
1 2 3 4 5
| /bin/bash /path/to/script.sh
crontab -l | grep -v "^#" | cut -f 6- -d " " | while read cmd; do eval $cmd; done
|
六、注意事项
- 脚本权限
1
| chmod +x /path/to/script.sh
|
- 避免频繁任务
* * * * *
(每分钟)可能对系统造成负担,建议至少间隔 5 分钟(*/5 * * * *
)。
- 依赖问题
如果脚本依赖 GUI 或 DISPLAY,需额外配置:1
| * * * * * export DISPLAY=:0 && /path/to/gui_script.sh
|
- 容器环境
在 Docker 中建议使用 supervisord
或直接通过 CMD
运行脚本。
七、高级用法
- 随机延迟(避免任务集中执行)
1 2
| 0 3 * * * sleep $((RANDOM\%300)) && /path/to/script.sh
|
- 锁机制(防止重复执行)
1
| */10 * * * * flock -n /tmp/backup.lock -c "/path/to/backup.sh"
|
- 邮件通知
1 2
| MAILTO="admin@example.com" 0 * * * * /path/to/monitor.sh
|
(任务输出会发送到指定邮箱)
总结
操作 |
命令 |
编辑定时任务 |
crontab -e |
查看定时任务 |
crontab -l |
删除所有任务 |
crontab -r |
指定用户 |
crontab -u username -e |
日志查看 |
tail -f /var/log/cron |
掌握这些技巧后,你可以轻松实现 自动化备份、日志轮转、服务监控 等任务!