最近开发时遇到例行繁琐的事务,解决以后便写下这篇文章跟大家分享,请大家不吝指教!阅读本篇文章,你将学到:

  • crontab 的基本概念与用途
  • 如何设定与管理排程任务
  • 实用的时间格式与特殊符号
  • 实务应用情境与范例
  • 提升工作效率的实用技巧

什么是 Crontab?

Crontab(cron table)是 Unix/Linux 系统中的排程工具,用于安排定期执行的任务。系统会透过 cron 守护进程(daemon)定期检查并执行设定的任务。

基本指令

查看现有排程

crontab -l

编辑排程(会进入文档编辑器模式,可能是 vi, vim, nano)

crontab -e

基本范例

# 每天早上 8:30 执行
30 8 * * * /path/to/script.sh

# 每周一至周五下午 6 点执行
0 18 * * 1-5 /path/to/script.sh

# 每两小时执行一次
0 */2 * * * /path/to/script.sh

时间格式说明

基本格式

栏位
分钟
小时
日期
月份
星期
命令
范例 30 8 * * 1-5 /path/to/script.sh
说明 第30分 早上8点 每日 每月 周一到周五 要执行的指令

时间范围表

栏位
可用范围
说明
分钟 0-59 每小时的第几分钟
小时 0-23 24小时制
日期 1-31 每月的第几天
月份 1-12 一年中的第几月
星期 0-7 0和7都代表星期日

特殊符号说明

符号
名称
用途
范例
* 星号 代表任何时间 * * * * * 每分钟执行
, 逗号 代表多个时间点 0,15,30,45 * * * * 每15分钟执行
- 减号 代表时间范围 0 9-17 * * * 朝九晚五每小时执行
/ 斜线 代表执行间隔 */15 * * * * 每15分钟执行
@yearly 年度 每年执行一次 @yearly /script.sh
@monthly 月份 每月执行一次 @monthly /script.sh
@weekly 周期 每周执行一次 @weekly /script.sh
@daily 日期 每天执行一次 @daily /script.sh
@hourly 小时 每小时执行一次 @hourly /script.sh
@reboot 重启 系统重启时执行 @reboot /script.sh

实务应用范例

情境说明:自动化帐单处理系统

身为一位系统管理者,您可能遇到这样的需求:

  • 每天需要从 AWS 下载昨日的帐单资料
  • 将下载的资料写入资料库做分析
  • 每月初要产生完整的月度报表
  • 过程中需要记录执行状况,方便除错

如果手动处理,您需要:

  • 每天早上登入 AWS 主控台
  • 下载昨天的帐单资料
  • 将资料整理后汇入资料库
  • 记录处理状况
  • 每个月还要花更多时间处理月报表
  • 使用 crontab 自动化后,这些工作都能自动完成!

    完整的排程设定范例

    # ====================================
    # AWS 帐单自动化处理系统
    # 功能:自动下载、处理、汇入每日帐单
    # 更新:2024-01-01
    # ====================================

    # 环境变数设定
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

    # 专案路径设定
    SCRIPT_PATH=/to/your/path
    LOG_PATH=/var/log/billing

    # === 每日任务 ===
    # 早上 8:30 从 AWS 下载昨日帐单
    30 8 * * * python3 $SCRIPT_PATH/aws_bill_download.py --daily --date=$(date -d "yesterday" +\\%Y-\\%m-\\%d) >> $LOG_PATH/download.log 2>&1

    # 早上 9:00 处理并汇入资料库
    0 9 * * * python3 $SCRIPT_PATH/process_daily_bill.py >> $LOG_PATH/process.log 2>&1

    # === 每月任务 ===
    # 每月 4 号早上 8:00 下载上个月完整帐单
    0 8 4 * * python3 $SCRIPT_PATH/aws_bill_download.py --monthly --month=$(date -d "last month" +\\%Y-\\%m) >> $LOG_PATH/monthly.log 2>&1

    # 每月 4 号早上 8:30 产生月度报表
    30 8 4 * * python3 $SCRIPT_PATH/generate_monthly_report.py >> $LOG_PATH/report.log 2>&1

    # === 资料备份 ===
    # 每天午夜 12:00 备份资料库
    0 0 * * * $SCRIPT_PATH/backup_database.sh >> $LOG_PATH/backup.log 2>&1

    设定说明

  • 环境变数

    • 设定基本的系统环境
    • 确保所有命令都能被正确找到
  • 路径管理

    • 使用变数管理脚本和日誌路径
    • 方便后续维护与修改
  • 任务分类

    • 每日任务:处理日常帐单
    • 月度任务:处理月报表
    • 备份任务:确保资料安全
  • 日誌记录

    • 每个任务都有独立的日誌
    • 使用 2>&1 同时记录标準输出和错误
    • 方便追踪除错
  • 实用小技巧

  • 日期处理

    # 取得昨天日期
    $(date -d "yesterday" +\\%Y-\\%m-\\%d)

    # 取得上个月
    $(date -d "last month" +\\%Y-\\%m)

  • 错误处理

    # 记录完整执行资讯
    command >> logfile.log 2>&1

  • 注解说明

    • 使用 === 分隔不同区块
    • 标注更新时间
    • 说明主要功能
  • 透过这样的设定,您可以:

    • 完全自动化日常工作
    • 有系统地管理各项任务
    • 方便地追踪执行状况
    • 轻鬆维护和更新设定

    这就是 crontab 在实务上的强大应用!