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