hexo目录文件变化自动编译

LinJiefeng Lv3

python脚本检测目录文件变化自动编译hexo静态文件

让AI帮忙写的

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
93
94
95
96
97
98
99
100
101
102
103
104
105
import os
from pathlib import Path
import os
import subprocess
import sys
def hexo_generate(hexo_dir):
try:
# 标准化路径
hexo_path = os.path.abspath(hexo_dir)
print(f"目标目录:{hexo_path}")

if not os.path.isdir(hexo_path):
print(f"错误:目录不存在 → {hexo_path}")
return

# 切换工作目录
os.chdir(hexo_path)
print(f"已切换到目录:{os.getcwd()}")

# ====================== 核心:自动系统切换 ======================
if sys.platform.startswith("win"):
# Windows 系统
print("检测到:Windows 系统")
command = "hexo g"
# 执行命令(最稳定写法)

else:
# Linux / Mac 系统
print("检测到:Linux/Mac 系统")
command = "hexo g"

result = subprocess.run(
command,
shell=True,
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding="utf-8"
)


print("\n✅ 执行成功!")
print(result.stdout)

except subprocess.CalledProcessError as e:
print("\n❌ 命令执行失败:")
print(e.stderr)
except Exception as e:
print("\n❌ 程序异常:", str(e))

class MultiFolderMonitor:
def __init__(self, folders: list, include_subfolders=False):
"""
初始化多文件夹监视器
:param folders: 文件夹路径列表(可传入多个文件夹)
:param include_subfolders: 是否监控子文件夹
"""
self.monitors = []
for folder in folders:
self.monitors.append(
_SingleFolderMonitor(folder, include_subfolders)
)

def has_changed(self):
"""
统一反馈信号:
只要任意一个文件夹变化 → 返回 True
全部无变化 → 返回 False
"""
changed = False
for monitor in self.monitors:
if monitor.has_changed():
changed = True
return changed

if __name__ == '__main__':
import time

# 传入多个文件夹路径
FOLDERS = [
r"D:\Project\hexo\blog\source\_data",
r"D:\Project\hexo\blog\source\_posts",
]
FOLDERS = [
r"/home/ubuntu/hexo/source/_data",
r"/home/ubuntu/hexo/source/_posts",
]
# 创建多文件夹监视器
monitor = MultiFolderMonitor(
folders=FOLDERS,
include_subfolders=True # 是否监控子文件夹
)
# 打开指定文件夹,好执行hexo指令
HEXO_BLOG_DIR = r"D:\Project\hexo\blog"
HEXO_BLOG_DIR = r"/home/ubuntu/hexo/"

# 循环检测
while True:
# 只有这一个信号
if monitor.has_changed():
hexo_generate(HEXO_BLOG_DIR)
print("✅ 检测到文件夹变化!")
time.sleep(1) # 检查间隔

系统服务运行脚本

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=has_changed
[Service]
User=ubuntu
ExecStart=/usr/bin/python3 /home/ubuntu/hexo/has_changed.py
WorkingDirectory=/home/ubuntu/hexo
Restart=on-failure
# 关键:直接指定 NVM 的 node 和 hexo 完整路径
Environment="PATH=/home/ubuntu/.nvm/versions/node/v22.17.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
[Install]
WantedBy=multi-user.target

碰到的问题:
在Ubuntu系统下,直接运行脚本能检测到目录文件变化并自动编译,但是在系统服务中运行脚本,检测不到目录文件变化时,不自动执行编译。

解决方法:

在系统服务中运行脚本,需要指定环境变量,否则无法正常运行。

在/etc/systemd/system/has_changed.service文件中添加以下内容:

1
2
# 关键:直接指定 NVM 的 node 和 hexo 完整路径
Environment="PATH=/home/ubuntu/.nvm/versions/node/v22.17.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"

/home/ubuntu/.nvm/versions/node/v22.17.0/bin替换为你的node路径

这样做就省去了每次更新文件后需要手动编译的操作。
只需专注于写文档就行了。
另外我服务器还部署了file browser,可以方便地管理和编辑文件。

  • 标题: hexo目录文件变化自动编译
  • 作者: LinJiefeng
  • 创建于 : 2026-03-27 13:45:51
  • 更新于 : 2026-03-27 13:46:01
  • 链接: https://blog.icsteam.cn/2026/03/27/110_script_flash/
  • 版权声明: 本文章采用 CC BY 4.0 进行许可。
评论