crontab命令指南:Linux定时任务管理工具
1. 简介
crontab(cron table)是Unix/Linux系统中用于设置周期性执行的任务的命令。它允许用户在固定的时间间隔执行指定的系统指令或shell脚本。
主要功能
- 定时执行命令和脚本
- 管理用户定时任务
- 系统自动化维护
- 日志轮转和备份
- 定期数据同步
2. 基本用法
crontab命令
# 编辑当前用户的crontab
crontab -e
# 列出当前用户的crontab
crontab -l
# 删除当前用户的crontab
crontab -r
# 编辑指定用户的crontab
sudo crontab -u username -e
基本语法
# crontab基本格式
# 分 时 日 月 星期 命令
0 2 * * * /path/to/script.sh
# 每天凌晨2点执行
0 2 * * * /path/to/backup.sh
# 每周日凌晨3点执行
0 3 * * 0 /path/to/weekly.sh
# 每月1号执行
0 0 1 * * /path/to/monthly.sh
3. 时间格式
时间字段说明
字段 允许值 特殊字符
分钟 0-59 , - */
小时 0-23 , - */
日期 1-31 , - */ L W
月份 1-12 , - */
星期 0-7 , - */ L #
(0和7都表示星期日)
特殊字符
# 每隔5分钟执行
*/5 * * * * command
# 每天8点到17点之间每小时执行
0 8-17 * * * command
# 每天8点和12点执行
0 8,12 * * * command
# 工作日(周一到周五)执行
0 9 * * 1-5 command
特殊时间格式
# 系统重启时执行
@reboot command
# 每天执行
@daily command
# 每周执行
@weekly command
# 每月执行
@monthly command
# 每年执行
@yearly command
4. 高级特性
环境变量
# 在crontab中设置环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
# 使用环境变量的任务
0 * * * * $HOME/scripts/hourly.sh
输出重定向
# 重定向标准输出和错误
0 2 * * * /path/to/script.sh >> /var/log/script.log 2>&1
# 丢弃所有输出
0 2 * * * /path/to/script.sh > /dev/null 2>&1
# 发送邮件通知
0 2 * * * /path/to/script.sh | mail -s "Cron Job Result" admin@example.com
5. 系统定时任务
系统cron目录
# 系统cron目录结构
/etc/cron.d/ # 系统任务目录
/etc/cron.daily/ # 每天执行的脚本
/etc/cron.hourly/ # 每小时执行的脚本
/etc/cron.monthly/# 每月执行的脚本
/etc/cron.weekly/ # 每周执行的脚本
# 系统级crontab
/etc/crontab
权限控制
# 允许/禁止用户使用crontab
/etc/cron.allow
/etc/cron.deny
# 检查cron服务状态
systemctl status cron
6. 最佳实践
任务管理
- 使用描述性注释说明任务用途
- 设置合理的执行时间,避免任务冲突
- 使用绝对路径指定命令和脚本
- 测试脚本可以独立运行
日志管理
- 记录任务执行日志
- 设置日志轮转
- 配置错误通知
- 定期检查任务执行状态
示例脚本
#!/bin/bash
# 备份脚本示例
# 设置日志文件
LOG_FILE="/var/log/backup.log"
# 记录开始时间
echo "Backup started at $(date)" >> $LOG_FILE
# 执行备份
if /path/to/backup.sh; then
echo "Backup completed successfully" >> $LOG_FILE
else
echo "Backup failed" >> $LOG_FILE
# 发送错误通知
mail -s "Backup Failed" admin@example.com < $LOG_FILE
fi
7. 常见问题排查
任务不执行
# 检查cron服务状态
systemctl status cron
# 检查cron日志
grep CRON /var/log/syslog
# 检查邮件日志
tail -f /var/mail/$USER
# 验证脚本权限
ls -l /path/to/script.sh
环境问题
# 测试脚本环境
env > /tmp/env.txt
# 添加环境变量
PATH=/usr/local/bin:$PATH
# 使用完整路径
/usr/local/bin/python /path/to/script.py
时间问题
# 检查系统时间
date
# 检查时区设置
timedatectl
# 同步系统时间
ntpdate pool.ntp.org