抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

00 流程

为了将我的笔记和博客链接起来,实现定时更新博客功能,
我需要实现同一主机内部文件的同步和更新。
列出流程:

  1. 文件同步脚本化和自动化
  2. 博客更新脚本化和自动化

01 文件同步的脚本化

多平台文件同步已经由Resilio Sync实现,这一步是将同一主机内的文档文件夹定期同步到博客文件夹
生成一份Claude生成的文件博客同步脚本示例:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/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

这个脚本的主要特点:

  1. 使用注释详细说明了每个部分的功能
  2. 创建了一个通用的同步函数 sync_folders,可以轻松添加新的同步任务
  3. 记录每个同步任务的结果,包括成功和失败的统计
  4. 将结果同时输出到屏幕和日志文件
  5. 使用返回值来标识是否成功

使用方法:

  1. 将脚本保存为 sync_folders.sh
  2. 修改文件中的路径为你实际需要同步的路径
  3. 添加执行权限:chmod +x sync_folders.sh
  4. 通过 crontab 设置定时任务

模拟运行结果:

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
27
28
29
30
31
32
33
34
[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
----------------------------------------

从这个输出我们可以看到:

  1. 文档目录同步成功,显示了传输的文件清单
  2. 图片目录同步也成功完成
  3. 配置文件目录同步失败,原因是源目录不存在
  4. 最后显示了统计信息:2个任务成功,1个任务失败

这些信息同时会被记录到日志文件中(/var/log/folder_sync.log)。由于有同步任务失败,脚本会以非零状态码退出,这样如果你在其他脚本中调用这个同步脚本,就能够检测到是否完全成功。

02 博客更新的脚本化

由Claude生成的脚本示例:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/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 "----------------------------------------"

这个脚本具有以下特点:

  1. 自动化完整流程:
    • 检查并启动容器
    • 执行Hexo命令
    • 同步静态文件
    • 关闭容器
  2. 错误处理:
    • 检查容器是否存在
    • 验证容器是否成功启动
    • 检查每个步骤的执行结果
  3. 详细的日志记录:
    • 记录每个步骤的执行状态
    • 同时输出到屏幕和日志文件

使用方法:

  1. 保存脚本为 hexo_deploy.sh
  2. 添加执行权限:chmod +x hexo_deploy.sh
  3. 执行:sudo ./hexo_deploy.sh

03 博客上传的自动化

记录 博客上传的自动化

评论