1)crontab 定时执行任务
crontab 是 Linux 中用于定时执行任务的核心工具,依托 cron 守护进程运行(cron 是系统级后台服务,默认随系统启动),支持按分钟、小时、日、月、周设定周期性任务,适用于日志切割、数据备份、定时脚本执行等场景。以下从基础用法、语法格式、实战示例、常见问题等方面详细介绍:
一、先确认 cron 服务是否运行
crontab 依赖 cron 进程,先确保服务已启动(否则定时任务不生效):
# 查看 cron 服务状态(CentOS 7+/Ubuntu 16.04+)
sudo systemctl status crond # CentOS/RHEL
# 或
sudo systemctl status cron # Ubuntu/Debian# 若未启动,启动并设置开机自启
sudo systemctl start crond && sudo systemctl enable crond # CentOS
# 或
sudo systemctl start cron && sudo systemctl enable cron # Ubuntu
重新启动
sudo systemctl restart crond # CentOS/RHEL
二、crontab 核心语法与操作命令
crontab 用于管理当前用户的定时任务(每个用户有独立的 crontab 文件,默认存储在 /var/spool/cron/用户名),核心操作命令如下:
| 命令 | 功能说明 | 示例 |
|---|---|---|
crontab -e |
编辑当前用户的定时任务(首次编辑会让选择编辑器,推荐 vim) |
crontab -e → 新增/修改任务 |
crontab -l |
列出当前用户的所有定时任务 | crontab -l → 查看已配置的任务 |
crontab -r |
删除当前用户的所有定时任务(谨慎使用,不可逆) | crontab -r → 清空所有任务 |
crontab -u 用户名 -l |
查看指定用户的定时任务(需 root 权限) | sudo crontab -u root -l → 查看 root 的任务 |
crontab -u 用户名 -e |
编辑指定用户的定时任务(需 root 权限) | sudo crontab -u root -e → 编辑 root 的任务 |
crontab -i |
删除任务前提示确认(避免误删) | crontab -ir → 交互式删除所有任务 |
三、定时任务的语法格式(核心重点)
编辑 crontab 时(crontab -e),每个定时任务占一行,格式严格遵循:
* * * * * 命令/脚本路径 # 五个星号分别对应:分 时 日 月 周
1. 五个时间字段的含义
| 字段位置 | 含义 | 取值范围 | 特殊符号说明 |
|---|---|---|---|
| 第 1 位 | 分钟(Minute) | 0-59 | *:每分钟;*/5:每 5 分钟;1-5:第 1-5 分钟;0,30:第 0 和 30 分钟 |
| 第 2 位 | 小时(Hour) | 0-23 | *:每小时;*/2:每 2 小时;8-18:早 8 点到晚 6 点 |
| 第 3 位 | 日(Day) | 1-31 | *:每天;1,15:每月 1 号和 15 号;1-5:每月前 5 天 |
| 第 4 位 | 月(Month) | 1-12 或 Jan-Dec | *:每月;3-5:3-5 月;12:12 月 |
| 第 5 位 | 周(Week) | 0-7 或 Sun-Sat(0 和 7 均代表周日) | *:每周;0:周日;1-5:周一到周五 |
2. 特殊符号的用法(灵活组合)
| 符号 | 作用 | 示例 |
|---|---|---|
* |
匹配该字段的所有值(“每”) | 第 1 位用 * → 每分钟 |
/ |
表示“每隔多久”(步长) | 第 1 位 */10 → 每 10 分钟;第 2 位 */3 → 每 3 小时 |
- |
表示范围 | 第 1 位 30-45 → 第 30 到 45 分钟;第 2 位 9-17 → 9 点到 17 点 |
, |
表示多个独立值 | 第 1 位 0,15,30,45 → 每 15 分钟;第 3 位 1,10,20 → 每月 1、10、20 号 |
? |
仅用于“日”和“周”字段,标识“无指定值”(避免日和周冲突) | 每月 1 号执行,不管是周几:0 0 1 * ? |
3. 语法格式注意事项
- 五个时间字段必须完整,缺一不可;
- 命令/脚本必须写绝对路径(避免环境变量问题,如
/usr/bin/ls而非ls); - 若命令有输出(如
echo "hello"),默认会发送邮件给当前用户,可通过>> /var/log/xxx.log 2>&1重定向到日志文件(推荐); - 注释行以
#开头,会被 cron 忽略。
四、实战示例(常用定时任务场景)
以下示例均通过 crontab -e 编辑(普通用户编辑自己的任务,系统级任务建议用 sudo crontab -u root -e):
1. 每 5 分钟执行一次脚本
*/5 * * * * /home/tangge/script/clean_log.sh >> /home/tangge/log/clean_log.log 2>&1
- 解读:
*/5 * * * *→ 每 5 分钟;脚本路径用绝对路径;输出重定向到日志文件(2>&1表示将错误输出也写入日志)。
2. 每天凌晨 2 点执行数据备份
0 2 * * * /usr/bin/tar -zcf /backup/data_$(date +\%Y\%m\%d).tar.gz /home/tangge/data >> /backup/backup.log 2>&1
- 解读:
0 2 * * *→ 每天 2 点 0 分;$(date +\%Y\%m\%d)生成日期(注意%前需加\转义,否则 cron 会解析错误);备份文件按日期命名。
3. 每周一上午 10 点执行日志切割
0 10 * * 1 /usr/sbin/logrotate /etc/logrotate.d/nginx >> /var/log/logrotate_nginx.log 2>&1
- 解读:
0 10 * * 1→ 每周一 10 点 0 分;logrotate是系统日志切割工具,需写绝对路径。
4. 每月 1 号和 15 号下午 3 点 30 分执行脚本
30 15 1,15 * * /home/tangge/script/check_service.sh >> /home/tangge/log/check_service.log 2>&1
- 解读:
30 15 1,15 * *→ 分钟 30、小时 15、日 1 和 15、月任意、周任意。
5. 工作日(周一到周五)晚上 8 点执行命令
0 20 * * 1-5 /usr/bin/echo "工作日提醒:检查服务状态" >> /home/tangge/reminder.log 2>&1
- 解读:
0 20 * * 1-5→ 每天 20 点 0 分,周一到周五。
6. 每小时的第 10 分钟执行命令
10 * * * * /usr/bin/df -h >> /home/tangge/log/disk_usage.log 2>&1
- 解读:
10 * * * *→ 每个小时的第 10 分钟。
五、系统级定时任务(/etc/crontab)
除了用户级 crontab(每个用户独立),还有系统级定时任务文件 /etc/crontab,格式与用户级略有不同(多了 USER 字段,指定执行任务的用户):
# 编辑系统级 crontab(需 root 权限)
sudo vim /etc/crontab# 示例:每天凌晨 3 点以 root 用户执行系统更新检查
0 3 * * * root /usr/bin/yum check-update >> /var/log/update_check.log 2>&1
- 特点:全局生效,可指定任意用户执行,适合系统级任务(如日志清理、系统监控)。
此外,/etc/cron.d/ 目录可存放自定义系统级任务文件(格式同 /etc/crontab),/etc/cron.hourly/、/etc/cron.daily/ 等目录可放入脚本(会按小时/天自动执行,无需写时间字段)。
六、常见问题与排查技巧
1. 定时任务不生效?(高频问题)
- 检查 cron 服务是否运行:
sudo systemctl status crond/cron; - 命令路径是否为绝对路径:用
which 命令查找绝对路径(如which tar→/usr/bin/tar); - 脚本是否有执行权限:
chmod +x /path/script.sh; - 环境变量问题:cron 的环境变量较少,脚本中建议写全环境变量(如
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin); - 日志重定向:通过日志文件查看错误(如
cat /home/tangge/log/clean_log.log); - 日期格式转义:
date命令中的%需加\转义(如date +\%Y\%m\%d)。
2. 如何测试定时任务?
- 用
* * * * *临时设置为每分钟执行,快速验证是否生效; - 直接执行脚本/命令,确认本身能正常运行(排除脚本自身错误)。
3. 查看 cron 执行日志(排查问题)
- CentOS/RHEL:
grep CROND /var/log/cron→ 查看 cron 进程的执行记录; - Ubuntu/Debian:
grep cron /var/log/syslog→ 查看 cron 相关日志; - 日志中会显示任务执行时间、用户、命令,若执行失败会有错误提示。
4. 避免任务重叠
若任务执行时间可能超过下次触发时间(如备份大文件),可在脚本中添加“锁文件”逻辑,避免多个进程同时运行:
# 脚本开头添加锁文件判断
LOCK_FILE="/tmp/backup.lock"
if [ -f "$LOCK_FILE" ]; thenecho "任务正在执行,跳过本次" >> /backup/backup.log 2>&1exit 1
fi
touch "$LOCK_FILE"# 脚本核心逻辑(备份操作)
/usr/bin/tar -zcf /backup/data_$(date +\%Y\%m\%d).tar.gz /home/tangge/data# 脚本结束删除锁文件
rm -f "$LOCK_FILE"
七、注意事项
- 权限控制:普通用户只能编辑自己的 crontab,无法查看/编辑其他用户的任务(root 除外);
- 敏感操作:系统级任务建议用 root 用户执行,避免权限不足;
- 资源占用:定时任务(如每 1 分钟执行的脚本)避免占用过多 CPU/内存,影响系统正常运行;
- 时区问题:cron 采用系统时区,若需指定其他时区,需修改系统时区(
timedatectl set-timezone Asia/Shanghai)。
总结
crontab 的核心价值是 自动化周期性任务,关键掌握:
- 操作命令:
crontab -e(编辑)、crontab -l(查看)、crontab -r(删除); - 语法格式:
分 时 日 月 周 绝对路径命令/脚本 日志重定向; - 排查技巧:确认 cron 服务、绝对路径、脚本权限、日志输出。
掌握以上内容,就能应对日志切割、数据备份、定时监控等绝大多数自动化场景!