chan

朝生暮死不足笑 但悲百年不足道

【Linux|crontab】crontab理论


crontab 是 Unix/Linux 系统中用于管理定时任务的工具,它让用户可以通过简单的配置,在指定时间执行某些命令或脚本。以下是对 crontab 的详细解析:


1. crontab 的基本组成

crontab 文件的每一行定义一个定时任务,其格式如下:

分 时 日 月 星期 命令
  • (minute):范围 0-59
  • (hour):范围 0-23(24 小时制)
  • (day of month):范围 1-31
  • (month):范围 1-12
  • 星期(day of week):范围 0-7(0 和 7 都表示星期日)

示例:

15 14 1 * * /path/to/script.sh

解释:每月 1 日的 14:15 执行脚本 /path/to/script.sh


2. 特殊符号的含义

crontab 支持使用特殊符号设置更灵活的时间:

符号含义
*表示任何值。例如:* 在分钟位表示每分钟都执行任务。
,用逗号分隔多个值。例如:1,15 表示第 1 分钟和第 15 分钟执行任务。
-指定范围。例如:1-5 表示从第 1 分钟到第 5 分钟都执行任务。
/表示步长。例如:*/5 表示每 5 分钟执行一次;1-10/2 表示从第 1 分钟开始,每 2 分钟执行一次。
?仅用于 day of monthday of week 字段,表示无关值(在 crontab 不常用)。

示例:

*/10 * * * * /path/to/script.sh

解释:每 10 分钟执行一次脚本 /path/to/script.sh


3. 特殊时间格式

crontab 还支持一些预定义的特殊时间格式,用来简化常见任务的配置:

符号等价表达式含义
@reboot在系统启动时运行一次
@yearly0 0 1 1 *每年一次,1 月 1 日 00:00 执行
@annually0 0 1 1 *@yearly
@monthly0 0 1 * *每月一次,1 日 00:00 执行
@weekly0 0 * * 0每周一次,星期日 00:00 执行
@daily0 0 * * *每日一次,00:00 执行
@midnight0 0 * * *@daily
@hourly0 * * * *每小时一次,每小时第 0 分钟执行

示例:

@reboot /path/to/script.sh

解释:在系统重启时执行脚本 /path/to/script.sh


4. 操作 crontab

查看定时任务

  • 查看当前用户的任务:
  crontab -l
  • 查看其他用户的任务(需要 sudo):
  sudo crontab -u username -l

编辑定时任务

  • 使用默认编辑器编辑任务:
  crontab -e

删除定时任务

  • 清空当前用户的所有定时任务:
  crontab -r

检查定时任务是否有效

  • crontab 文件保存时,系统会自动检查语法是否正确。
  • 若需手动验证:
  crontab -u username -l | crontab -

5. crontab 配置实例

示例 1:每天凌晨 1 点备份数据库

0 1 * * * /usr/bin/python3 /home/user/backup.py >> /home/user/backup.log 2>&1

示例 2:每小时的第 10 和 50 分钟执行任务

10,50 * * * * /home/user/script.sh

示例 3:工作日的每天下午 2 点到 6 点,每 30 分钟执行任务

*/30 14-18 * * 1-5 /home/user/weekday_task.sh

示例 4:每月的最后一天运行脚本

59 23 28-31 * * [ "$(date +\%d -d tomorrow)" == "01" ] && /home/user/end_of_month.sh

6. 日志与调试

查看 cron 日志

  • 系统 cron 任务日志通常在以下位置:
  /var/log/cron
  /var/log/syslog  # 部分系统
  • 查看日志内容:
  tail -f /var/log/cron

调试 crontab

  • 确保 cron 服务正在运行:
  systemctl status cron
  • 如果脚本不执行,常见问题:
  1. 路径问题cron 使用的环境变量较少,可能需要指定完整路径。
    bash PATH=/usr/local/bin:/usr/bin:/bin
  2. 权限问题:确保脚本和日志文件可被当前用户访问。
  3. 输出检查:将任务输出写入日志文件排查问题。

7. 环境变量

crontab 文件中,支持设置环境变量:

PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=user@example.com
SHELL=/bin/bash
  • PATH:指定任务的执行路径。
  • MAILTO:将任务输出通过邮件发送到指定邮箱。
  • SHELL:指定脚本使用的 shell 类型。

通过以上详解,你可以灵活使用 crontab 进行定时任务管理,适用于各种场景的任务调度!

评论
还没有评论
    发表评论 说点什么