Cron 定时规则指南


一、什么是 Cron?为什么需要它?

Cron 是什么?

Cron 是 Linux 和 Unix 系统中用于定时执行任务的程序,就像你的智能闹钟一样:

  • 自动运行:系统启动后自动运行,无需人工干预
  • 定时检查:每分钟检查一次是否有任务要执行
  • 自动执行:在预设时间自动执行命令或脚本
  • 灵活配置:支持系统级和用户级任务调度

Cron 能做什么?

想象以下场景,都可以交给 Cron 来完成:

应用场景具体任务使用频率
数据备份每天凌晨自动备份数据库每天一次
日志管理每周清理过期日志文件每周一次
系统监控每小时检查服务是否正常运行每小时一次
报告生成每月生成业务报表每月一次
定时通知工作日发送提醒邮件工作日每天

为什么需要 Cron?

  • 自动化:替代人工执行重复性任务,节省时间和精力
  • 准确性:精确到分钟级执行,不会遗漏或延迟
  • 无人值守:即使你不在电脑前,任务也能按时执行
  • 可靠性:系统级服务,稳定可靠

二、Cron 的工作原理

Cron 的组成部分

  1. Cron 守护进程(crond):后台持续运行的程序,负责定时检查和执行任务
  2. Crontab 文件:存储定时任务配置的文件
  3. Cron 表达式:定义执行时间的语法规则

Crontab 文件的位置

Cron 支持两种级别的任务配置:

级别配置方式文件位置特点
用户级crontab -e/var/spool/cron/用户名每个用户独立配置,以用户身份执行
系统级编辑 /etc/crontab/etc/crontab管理员配置,需要指定执行用户

Cron 的工作流程

1
2
3
4
5
6
7
8
9
10
11
1. Cron 守护进程启动

2. 每分钟检查 crontab 文件

3. 解析 Cron 表达式

4. 判断是否到执行时间

5. 如果时间匹配,执行命令/脚本

6. 等待下一分钟重复检查

三、Cron 表达式详解

基本格式

Cron 表达式由 5 个时间字段1 个命令字段 组成:

1
2
3
4
5
6
7
* * * * * command
│ │ │ │ │
│ │ │ │ └─ 星期几 (0-6, 0=周日, 7=周日)
│ │ │ └─ 月份 (1-12 或 jan, feb...)
│ │ └─ 日期 (1-31)
│ └─ 小时 (0-23)
└─ 分钟 (0-59)

字段取值范围

字段取值范围说明
分钟0-59每小时的第几分钟
小时0-23每天的第几小时(24小时制)
日期1-31每月的第几天
月份1-12 或 jan-dec月份
星期0-7 或 sun-sat0 和 7 都表示周日

特殊符号用法

Cron 支持多种特殊符号来表达复杂的时间规则:

1. 星号 * - “每”

表示匹配该字段的所有值

1
2
3
* * * * * command    # 每分钟执行
0 * * * * command # 每小时的0分执行(每小时一次)
0 0 * * * command # 每天0点0分执行(每天一次)

2. 逗号 , - “或”

表示在多个时间点执行:

1
2
0 8,12,18 * * * command    # 每天8点、12点、18点执行
0 0 1,15 * * command # 每月1号和15号执行

3. 中杠 - - “到”

表示连续时间段

1
2
0 9-18 * * * command    # 每天9点到18点,每小时执行
0 0 1-5 * * command # 每月1号到5号,每天执行

4. 斜杠 / - “间隔”

表示固定间隔执行:

1
2
3
*/5 * * * * command     # 每5分钟执行一次
0 */3 * * * command # 每3小时执行一次(0点、3点、6点...)
0 0 */2 * * command # 每2天执行一次(1号、3号、5号...)

5. 组合使用

可以组合多种符号实现复杂规则:

1
2
0 9-17 * * 1-5 command    # 周一到周五,9点到17点每小时执行
0 10 * * 6,7 command # 周六和周日的10点执行

日期和星期的关系

重要规则:当日期和星期都指定时,满足任意一个条件就会执行。

1
2
# 这个会在每月1-5号执行,也会在每周一到周五执行
0 0 1-5 * 1-5 command

四、常用命令实战

基础命令

命令说明示例
crontab -l查看当前用户的定时任务crontab -l
crontab -e编辑当前用户的定时任务crontab -e
crontab -r删除当前用户的所有任务(危险!)crontab -r
crontab -ri交互式删除(推荐)crontab -ri
crontab -u user -e编辑指定用户的任务(需root)sudo crontab -u nginx -e

编辑任务示例

  1. 运行 crontab -e 进入编辑模式(首次编辑需选择编辑器,推荐 vim)
  2. i 进入插入模式
  3. 输入任务配置
  4. ESC 退出插入模式
  5. 输入 :wq 保存退出

五、实用示例

基础示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 每分钟执行
* * * * * /path/to/script.sh

# 每小时的第30分钟执行
30 * * * * /path/to/script.sh

# 每天凌晨2点执行
0 2 * * * /path/to/script.sh

# 每天上午9点和下午6点执行
0 9,18 * * * /path/to/script.sh

# 每隔5分钟执行
*/5 * * * * /path/to/script.sh

# 每隔2小时执行
0 */2 * * * /path/to/script.sh

# 工作日每天9点执行
0 9 * * 1-5 /path/to/script.sh

# 每月1号凌晨执行
0 0 1 * * /path/to/script.sh

# 每周日凌晨3点执行
0 3 * * 0 /path/to/script.sh

特殊关键字(简化写法)

Cron 提供了一些关键字来简化常用的时间配置:

关键字等价表达式说明
@reboot-系统重启后执行一次
@yearly0 0 1 1 *每年1月1日0点
@monthly0 0 1 * *每月1日0点
@weekly0 0 * * 0每周日0点
@daily0 0 * * *每天0点
@hourly0 * * * *每小时0分
1
2
3
@daily /path/to/daily_backup.sh    # 每天0点执行备份
@weekly /path/to/weekly_clean.sh # 每周日0点执行清理
@reboot /path/to/startup.sh # 重启后执行初始化

系统级任务示例

系统级 crontab(/etc/crontab)需要额外指定执行用户:

1
2
3
# 格式:分 时 日 月 周 用户 命令
0 2 * * * root /usr/local/bin/daily_backup.sh
0 3 * * 0 root /usr/local/bin/weekly_clean.sh

六、使用面板管理定时脚本

青龙面板是一款可视化的定时任务管理平台,支持 Python3、JavaScript、Shell 等多种脚本语言,让定时任务管理变得简单直观。

相比于传统的 Cron 命令行配置,青龙面板具有以下优势:

特性传统 Cron青龙面板
配置方式命令行编辑可视化 Web 界面
任务管理文本文件图形化列表
日志查看命令行查看实时日志面板
错误告警无内置机制多种通知方式
权限管理系统用户权限精细化角色权限
脚本管理分散存储集中管理

青龙面板的核心功能

  1. 多语言脚本支持:Python3、JavaScript、Shell
  2. 可视化任务配置:图形化界面管理定时任务
  3. 秒级任务调度:支持精确到秒的定时任务
  4. 在线脚本管理:上传、编辑、删除脚本文件
  5. 环境变量管理:统一管理脚本所需的环境变量
  6. 实时日志监控:查看任务执行日志
  7. 系统通知:支持多种通知方式(微信、Telegram、钉钉等)
  8. 暗黑模式:支持亮色/暗色主题切换
  9. 移动端适配:支持手机端访问管理

安装青龙面板(Docker 方式)

环境准备

确保已安装 Docker 和 Docker Compose:

1
2
3
4
5
6
# 安装 Docker(以 Ubuntu 为例)
curl -sSL get.docker.com | sh

# 启动 Docker 服务
systemctl start docker
systemctl enable docker

安装命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建青龙面板目录
mkdir -p /opt/qinglong
cd /opt/qinglong

# 运行青龙面板容器
docker run -dit \
-v $PWD/config:/ql/config \
-v $PWD/log:/ql/log \
-v $PWD/db:/ql/db \
-v $PWD/scripts:/ql/scripts \
-p 5700:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
whyour/qinglong:latest

访问面板

  1. 打开浏览器访问:http://服务器IP:5700
  2. 首次访问会提示初始化配置
  3. 创建管理员账号和密码
  4. 登录后即可开始使用

青龙面板使用教程

1. 创建第一个任务

登录青龙面板后,点击左侧菜单栏的定时任务新建任务

1
2
3
4
5
6
7
8
9
10
# 示例:Python 脚本 - 定时输出当前时间
import datetime

def main():
current_time = datetime.datetime.now()
print(f"🕐 当前时间:{current_time.strftime('%Y-%m-%d %H:%M:%S')}")
print("👋 青龙面板任务执行成功!")

if __name__ == "__main__":
main()

2. 设置定时规则

青龙面板支持标准 Cron 表达式,格式为:

1
分 时 日 月 周

常用示例:

Cron 表达式含义
*/5 * * * *每5分钟执行一次
0 2 * * *每天凌晨2点执行
0 9,18 * * *每天9点和18点执行
0 9-17 * * 1-5工作日9点到17点每小时执行
0 0 1 * *每月1号凌晨执行

3. 查看任务日志

点击任务列表右侧的日志按钮,即可查看任务执行日志:

1
2
3
4
5
# 日志示例
2024-01-15 02:00:01 [INFO] 开始执行任务:daily_backup
2024-01-15 02:00:01 [INFO] 正在备份数据库...
2024-01-15 02:00:05 [INFO] 备份完成,文件大小:256MB
2024-01-15 02:00:05 [SUCCESS] 任务执行成功

4. 订阅管理(拉取仓库脚本)

脚本订阅是青龙面板的核心功能之一,能够自动从 GitHub/GitCode 等代码仓库同步脚本,并创建定时任务。

订阅配置详细步骤
  1. 进入订阅管理界面

    • 点击左侧菜单栏的订阅管理
    • 点击右上角添加订阅按钮
  2. 填写订阅信息

    字段说明示例
    类型选择仓库类型公开仓库
    仓库地址Git 仓库 URLhttps://github.com/your/repo.git
    订阅名称自定义名称huajiScript
    定时规则Cron 表达式0 0 0 * * *(每天凌晨更新)
  3. 高级筛选设置

    • 分支:留空使用默认主分支
    • 白名单:只拉取包含这些关键词的脚本
    • 黑名单:排除包含这些关键词的脚本
    • 文件后缀:指定拉取的文件类型(如 .py.js
  4. 订阅命令格式

    1
    2
    3
    4
    5
    # 完整格式
    ql repo <仓库URL> <白名单> <黑名单> <依赖文件> <分支> <文件后缀>

    # 示例:订阅京东脚本仓库
    ql repo https://github.com/shufflewzc/faker4.git "jd_|jx_|gua_" "activity|backUp" "^jd[^_]|USER" "main" "js py"
  5. 订阅工作原理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ┌─────────────┐ 定时触发 ┌─────────────┐ 自动同步 ┌─────────────┐
    │ 定时任务 │ ──────────>│ 订阅系统 │ ──────────>│ 脚本仓库 │
    └─────────────┘ └──────┬──────┘ └─────────────┘


    ┌─────────────┐
    │ 任务调度器 │
    └──────┬──────┘


    ┌─────────────┐
    │ 结果记录器 │
    └─────────────┘

5. 环境变量配置

环境变量用于存储敏感信息(如 API 密钥、Cookie 等),避免将敏感信息明文写入脚本。

添加环境变量步骤
  1. 进入环境变量界面

    • 点击左侧菜单栏的环境变量
    • 点击右上角新建变量按钮
  2. 配置环境变量

    字段说明示例
    名称变量名(大写)JD_COOKIE
    变量内容pt_key=xxx;pt_pin=xxx;
    备注描述信息京东账号 Cookie
    是否启用是否生效启用
  3. 多账号配置示例

    1
    2
    3
    4
    5
    6
    7
    8
    # 单个账号
    export JD_COOKIE="pt_key=xxx;pt_pin=xxx;"

    # 多个账号(JSON 数组格式)
    export JD_COOKIE='[
    {"cookie": "pt_key=账号1;pt_pin=账号1;"},
    {"cookie": "pt_key=账号2;pt_pin=账号2;"}
    ]'
  4. 在脚本中使用环境变量

    1
    2
    3
    4
    # Python 示例
    import os
    cookie = os.environ.get('JD_COOKIE')
    print(f"Cookie: {cookie}")
    1
    2
    3
    // JavaScript 示例
    const cookie = process.env.JD_COOKIE;
    console.log(`Cookie: ${cookie}`);

6. 环境配置

青龙面板支持配置 Python、Node.js 等运行环境,安装脚本所需的依赖包。

依赖管理
  1. 进入依赖管理界面

    • 点击左侧菜单栏的依赖管理
  2. 安装依赖

    • Node.js 依赖:在输入框输入包名,点击安装
    • Python 依赖:输入 pip 包名,点击安装
    • Linux 依赖:输入系统包名,点击安装
  3. 常用依赖列表

    1
    2
    3
    4
    5
    6
    7
    8
    # Node.js 常用依赖
    request crypto-js prettytable dotenv jsdom date-fns

    # Python 常用依赖
    requests beautifulsoup4 lxml aiohttp PyExecJS

    # Linux 常用依赖
    gcc g++ python3-dev libffi-dev openssl-dev
  4. 批量安装依赖

    • 勾选多个依赖包
    • 点击批量安装按钮
    • 勾选自动拆分可自动处理多个包名
系统设置
  1. 基础设置

    • API 地址:设置面板访问地址
    • 通知设置:配置 Telegram、钉钉、微信等通知渠道
    • 安全设置:启用登录验证、设置 IP 白名单
  2. 配置文件管理

    • 编辑 config.sh 配置订阅默认参数
    • 配置 notify.py 设置通知模板

内置命令

青龙面板提供了一些内置命令,可在容器中执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 更新青龙面板
ql update

# 拉取单个脚本
ql raw <脚本URL>

# 拉取仓库脚本
ql repo <仓库URL> <白名单> <黑名单>

# 删除旧日志(保留最近7天)
ql rmlog 7

# 检查环境并修复
ql check

实际应用场景

场景1:定时数据备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 每天凌晨2点备份 MySQL 数据库

DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/mysql"
DB_NAME="example_db"
DB_USER="backup_user"
DB_PASSWORD="your_password"

mkdir -p $BACKUP_DIR

mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/$DB_NAME_$DATE.sql

echo "备份完成:$BACKUP_DIR/$DB_NAME_$DATE.sql"

场景2:定时发送通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
import datetime
import os

def send_telegram_message(message):
bot_token = os.environ.get('TELEGRAM_BOT_TOKEN')
chat_id = os.environ.get('TELEGRAM_CHAT_ID')

url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
params = {
'chat_id': chat_id,
'text': message
}

response = requests.get(url, params=params)
return response.json()

if __name__ == "__main__":
current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
message = f"📊 每日报告\n时间:{current_time}\n任务执行正常!"

result = send_telegram_message(message)
print(f"通知发送结果:{result}")

文章作者: 栖桐听雨
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 栖桐听雨 !
  目录