文件同步和博客更新的自动化
将我的笔记和博客链接起来,实现定时更新博客功能.
FILE / 20241230-29
AUTHOR / MAGICNUE
TYPE / CODING RECORD
AUTHOR / MAGICNUE
TYPE / CODING RECORD
00 流程
为了将我的笔记和博客链接起来,实现定时更新博客功能, 我需要实现同一主机内部文件的同步和更新。 列出流程:
- 文件同步脚本化和自动化
- 博客更新脚本化和自动化
01 文件同步的脚本化
多平台文件同步已经由Resilio Sync实现,这一步是将同一主机内的文档文件夹定期同步到博客文件夹。 生成一份Claude生成的文件博客同步脚本示例:
#!/bin/bash
# 设置日期格式,用于日志记录
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# 定义日志文件路径
LOG_FILE="/var/log/folder_sync.log"
# 定义一个函数来执行同步并检查结果
sync_folders() {
local source=$1
local dest=$2
local description=$3
echo "[$DATE] 开始同步: $description" | tee -a $LOG_FILE
# 执行rsync命令,保存退出状态
rsync -av --delete "$source" "$dest"
status=$?
# 检查同步结果
if [ $status -eq 0 ]; then
echo "[$DATE] ✓ 成功: $description 同步完成" | tee -a $LOG_FILE
return 0
else
echo "[$DATE] ✗ 失败: $description 同步失败(错误代码: $status)" | tee -a $LOG_FILE
return 1
fi
}
# 初始化计数器
success_count=0
fail_count=0
# 第一个同步任务:文档目录
sync_folders "/path/to/docs/A/" "/path/to/docs/B/" "文档目录同步"
if [ $? -eq 0 ]; then
((success_count++))
else
((fail_count++))
fi
# 第二个同步任务:图片目录
sync_folders "/path/to/images/A/" "/path/to/images/B/" "图片目录同步"
if [ $? -eq 0 ]; then
((success_count++))
else
((fail_count++))
fi
# 第三个同步任务:配置文件目录
sync_folders "/path/to/config/A/" "/path/to/config/B/" "配置文件同步"
if [ $? -eq 0 ]; then
((success_count++))
else
((fail_count++))
fi
# 输出最终统计结果
echo "----------------------------------------" | tee -a $LOG_FILE
echo "[$DATE] 同步任务完成统计:" | tee -a $LOG_FILE
echo "成功:$success_count" | tee -a $LOG_FILE
echo "失败:$fail_count" | tee -a $LOG_FILE
echo "----------------------------------------" | tee -a $LOG_FILE
# 如果有任何任务失败,脚本返回非零状态
if [ $fail_count -gt 0 ]; then
exit 1
fi
这个脚本的主要特点:
- 使用注释详细说明了每个部分的功能
- 创建了一个通用的同步函数
sync_folders,可以轻松添加新的同步任务 - 记录每个同步任务的结果,包括成功和失败的统计
- 将结果同时输出到屏幕和日志文件
- 使用返回值来标识是否成功
使用方法:
- 将脚本保存为 sync_folders.sh
- 修改文件中的路径为你实际需要同步的路径
- 添加执行权限:
chmod +x sync_folders.sh - 通过 crontab 设置定时任务
模拟运行结果:
[2024-12-30 15:30:22] 开始同步: 文档目录同步
sending incremental file list
documents/
documents/file1.txt
documents/file2.doc
documents/subfolder/
documents/subfolder/file3.pdf
sent 1,234 bytes received 567 bytes 3,602.00 bytes/sec
total size is 10,485,760 speedup is 5,832.09
[2024-12-30 15:30:25] ✓ 成功: 文档目录同步完成
[2024-12-30 15:30:25] 开始同步: 图片目录同步
sending incremental file list
images/
images/photo1.jpg
images/photo2.png
images/vacation/
images/vacation/img001.jpg
sent 2,468 bytes received 892 bytes 6,720.00 bytes/sec
total size is 25,365,728 speedup is 7,561.23
[2024-12-30 15:30:28] ✓ 成功: 图片目录同步完成
[2024-12-30 15:30:28] 开始同步: 配置文件同步
sending incremental file list
rsync: link_stat "/path/to/config/A" failed: No such file or directory (2)
[2024-12-30 15:30:28] ✗ 失败: 配置文件同步失败(错误代码: 23)
----------------------------------------
[2024-12-30 15:30:28] 同步任务完成统计:
成功:2
失败:1
----------------------------------------
从这个输出我们可以看到:
- 文档目录同步成功,显示了传输的文件清单
- 图片目录同步也成功完成
- 配置文件目录同步失败,原因是源目录不存在
- 最后显示了统计信息:2个任务成功,1个任务失败
这些信息同时会被记录到日志文件中(/var/log/folder_sync.log)。由于有同步任务失败,脚本会以非零状态码退出,这样如果你在其他脚本中调用这个同步脚本,就能够检测到是否完全成功。
02 博客更新的脚本化
由Claude生成的脚本示例:
#!/bin/bash
# 设置日期格式用于日志
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# 定义容器名称
CONTAINER_NAME="node-hexo-blog"
# 定义源目录和目标目录
SOURCE_DIR="/DATA/AppData/node-hexo-blog/blog/public/"
DEST_DIR="/opt/1panel/apps/openresty/openresty/www/sites/hexo.magicnue.top/index/"
# 定义日志文件
LOG_FILE="/var/log/hexo_deploy.log"
# 记录日志的函数
log_message() {
echo "[$DATE] $1" | tee -a $LOG_FILE
}
# 检查容器状态的函数
check_container_status() {
docker ps -a --format '{{.Names}}' | grep "^${CONTAINER_NAME}$" > /dev/null 2>&1
return $?
}
# 检查容器是否运行的函数
is_container_running() {
docker ps --format '{{.Names}}' | grep "^${CONTAINER_NAME}$" > /dev/null 2>&1
return $?
}
# 1. 启动容器(如果需要)
log_message "开始检查容器状态..."
if ! check_container_status; then
log_message "错误: 容器 ${CONTAINER_NAME} 不存在"
exit 1
fi
if ! is_container_running; then
log_message "启动容器 ${CONTAINER_NAME}..."
docker start ${CONTAINER_NAME}
sleep 5 # 等待容器完全启动
if ! is_container_running; then
log_message "错误: 容器启动失败"
exit 1
fi
log_message "容器已成功启动"
else
log_message "容器已经在运行中"
fi
# 2. 执行Hexo命令
log_message "开始执行Hexo命令..."
docker exec -i ${CONTAINER_NAME} /bin/sh -c "cd /hexo/blog && hexo clean && hexo g"
if [ $? -eq 0 ]; then
log_message "Hexo静态文件生成成功"
else
log_message "错误: Hexo命令执行失败"
exit 1
fi
# 3. 同步文件
log_message "开始同步静态文件..."
rsync -av --delete "${SOURCE_DIR}" "${DEST_DIR}"
if [ $? -eq 0 ]; then
log_message "文件同步成功"
else
log_message "错误: 文件同步失败"
exit 1
fi
# 4. 停止容器
log_message "停止容器..."
docker stop ${CONTAINER_NAME}
if [ $? -eq 0 ]; then
log_message "容器已成功停止"
else
log_message "警告: 容器停止失败"
# 不退出,因为主要任务已完成
fi
# 输出完成信息
log_message "----------------------------------------"
log_message "部署流程已完成"
log_message "----------------------------------------"
这个脚本具有以下特点:
- 自动化完整流程:
- 检查并启动容器
- 执行Hexo命令
- 同步静态文件
- 关闭容器
- 错误处理:
- 检查容器是否存在
- 验证容器是否成功启动
- 检查每个步骤的执行结果
- 详细的日志记录:
- 记录每个步骤的执行状态
- 同时输出到屏幕和日志文件
使用方法:
- 保存脚本为 hexo_deploy.sh
- 添加执行权限:
chmod +x hexo_deploy.sh - 执行:
sudo ./hexo_deploy.sh