自动清理pelican缓存的脚本

wen 实用脚本 5

自动清理Pelican缓存的脚本实战指南

目录导读

  1. 为什么要清理Pelican缓存?
  2. 手动清理的痛点
  3. 自动清理脚本的核心逻辑
  4. 脚本实现与详解
  5. 如何集成到部署流程中
  6. 常见问题与解答

为什么要清理Pelican缓存?

Pelican作为一款优秀的静态站点生成器,在每次构建时都会生成大量缓存文件,这些缓存包括已渲染的HTML、主题资源、插件中间文件等,当你的博客经历以下场景时,缓存问题就会凸显:

自动清理pelican缓存的脚本

  • 修改主题或配置后,旧缓存导致页面样式不更新
  • 文章数量增长到数百篇,构建时间从几秒膨胀到数分钟
  • 频繁发布和回滚,缓存目录积累了大量废弃文件

一个典型的Pelican项目在运行几个月后,outputcache目录可能会占用数百MB甚至GB级的磁盘空间,这不仅拖慢构建速度,还可能导致某些插件因读取陈旧缓存而报错。


手动清理的痛点

许多用户依赖以下方式进行清理:

pelican content -s publishconf.py --delete-output-directory

或者直接:

rm -rf output cache

但手动操作存在三个致命缺陷:

  1. 遗忘风险:你很可能在连续调试10次后忘记清理,结果被诡异的前端bug困扰半小时
  2. 耗时浪费:每次全量构建需要3-5分钟,手动等待让人烦躁
  3. 部署割裂:当你使用CI/CD自动化部署时,手动清理环节无法集成

这正是我们需要一个自动清理脚本的根本原因。


自动清理脚本的核心逻辑

一个优秀的自动清理脚本应满足:

  • 智能识别:不是无脑删除全部缓存,而是清理过期的、无用的文件
  • 安全防护:不删除用户手动创建的重要文件(如content/articles
  • 可配置性:通过环境变量或配置文件控制清理行为
  • 日志输出:记录清理了哪些文件、释放了多少空间

以下脚本基于这些原则设计。


脚本实现与详解

脚本:clean_pelican_cache.sh

#!/bin/bash
# Pelican缓存自动清理脚本
# 用途:清理output、cache目录,保留关键配置和内容文件
PELICAN_DIR="${1:-.}"  # 允许传入项目根目录参数
OUTPUT_DIR="$PELICAN_DIR/output"
CACHE_DIR="$PELICAN_DIR/cache"
CONFIG_FILE="$PELICAN_DIR/pelicanconf.py"
CONTENT_DIR="$PELICAN_DIR/content"
LOG_FILE="$PELICAN_DIR/logs/clean_cache.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
# 检查依赖命令
for cmd in rm find du; do
    if ! command -v $cmd &> /dev/null; then
        echo "错误:缺少$cmd命令"
        exit 1
    fi
done
# 创建日志目录
mkdir -p "$(dirname "$LOG_FILE")"
# 安全防护:确保不删除内容目录
if [ ! -d "$CONTENT_DIR" ]; then
    echo "$TIMESTAMP [错误] 内容目录 $CONTENT_DIR 不存在,脚本终止" >> "$LOG_FILE"
    echo "错误:内容目录不存在,请从Pelican项目根目录运行此脚本。"
    exit 1
fi
# 记录清理开始
echo "$TIMESTAMP [开始] Pelican缓存清理" >> "$LOG_FILE"
# 清理output目录(保留.git等隐藏文件)
if [ -d "$OUTPUT_DIR" ]; then
    OUTPUT_SIZE=$(du -sh "$OUTPUT_DIR" | cut -f1)
    # 删除output内的所有非隐藏文件和目录
    find "$OUTPUT_DIR" -maxdepth 1 -not -path '*/\.*' -not -path "$OUTPUT_DIR" -exec rm -rf {} + 2>/dev/null
    echo "$TIMESTAMP [完成] 清理output目录 (原大小: $OUTPUT_SIZE)" >> "$LOG_FILE"
fi
# 清理cache目录
if [ -d "$CACHE_DIR" ]; then
    CACHE_SIZE=$(du -sh "$CACHE_DIR" | cut -f1)
    rm -rf "$CACHE_DIR"/*
    echo "$TIMESTAMP [完成] 清理cache目录 (原大小: $CACHE_SIZE)" >> "$LOG_FILE"
fi
# 清理pelican生成的临时文件(如.pelican_plugins_cache)
find "$PELICAN_DIR" -maxdepth 1 -name ".pelican_*" -type f -delete 2>/dev/null
# 释放系统缓存(可选,需要sudo)
# sync && echo 3 > /proc/sys/vm/drop_caches
echo "$TIMESTAMP [全部完成] 缓存清理结束" >> "$LOG_FILE"
echo "缓存清理完成!输出目录和缓存目录已被清空。"

使用方法

  1. 将脚本保存到Pelican项目根目录
  2. 赋予执行权限:chmod +x clean_pelican_cache.sh
  3. 运行:./clean_pelican_cache.sh

安全特性

  • 脚本会首先验证content目录是否存在,防止在错误目录执行
  • 只删除output下的非隐藏文件,保护.git.gitignore
  • 记录详细的日志到logs/clean_cache.log,方便追溯

如何集成到部署流程中

Git Hooks(推荐)

.git/hooks/pre-push中添加:

#!/bin/bash
# 在push到远程仓库前自动清理缓存
cd /path/to/your/pelican/project
./clean_pelican_cache.sh
# 然后执行重新构建
pelican content -s publishconf.py

Makefile集成

在项目根目录的Makefile中添加:

clean-cache:
    @echo "Cleaning Pelican cache..."
    @./clean_pelican_cache.sh
    @echo "Rebuilding site..."
    @pelican content -s publishconf.py

之后通过make clean-cache一键清理并构建。

部署脚本(如Fabric或Ansible)

# deploy.py (Fabric示例)
from fabric import task
@task
def clean_cache(c):
    c.run("bash clean_pelican_cache.sh")
    c.run("pelican content -s publishconf.py --output output")

常见问题与解答

Q1:为什么我不能直接删除整个项目目录再克隆?

答: 这样做会删除contenttheme、配置文件等用户数据,极其危险,自动脚本只针对outputcache等自动生成的目录,保障用户文件安全。

Q2:清理后构建速度反而变慢了怎么办?

答: 首次全量构建确实会慢,但后续增量构建会恢复,如果希望保留部分缓存加速,可以修改脚本只清空cache目录,保留output(不推荐)。

Q3:脚本报错“内容目录不存在”怎么办?

答: 这表示你未从项目根目录运行脚本,请确保脚本和content文件夹在同一层级,或者使用:
./clean_pelican_cache.sh /absolute/path/to/project

Q4:如何实现定时自动清理?

答: 使用crontab:
0 2 * * 0 cd /path/to/project && ./clean_pelican_cache.sh
这将在每周日凌晨2点自动清理。

Q5:清理后某些页面404了?

答: 因为清理了output目录但未重新构建,脚本设计初衷是在重新构建前使用,请确保在清理后立即执行pelican content命令。

Q6:这个脚本会影响Git version控制吗?

答: 不会,脚本使用maxdepth 1和排除隐藏文件的逻辑,不会触及.git目录,如果你将output纳入Git管理,建议将其加入.gitignore


通过这个自动清理Pelican缓存的脚本,你可以将重复性劳动交给机器,专注于内容创作本身,脚本的安全设计、日志记录和可集成特性,使其适合从单兵作战到企业级部署的各种场景。优秀的工具让你忘记工具的存在——这也是自动化脚本的终极追求。

抱歉,评论功能暂时关闭!