Beijing, China: ☀️ 🌡️-0°C 🌬️↙5km/h

✨ 写在前面

2024 年,我一共写了 8 篇博客。说实话,这个数量实在算不上多,质量也称不上精美。仔细反思了一下原因,主要有以下几点:

1️⃣ 惰性作祟,缺乏坚持的动力;
2️⃣ 缺乏内心的主动接纳,总把写博客作为繁琐的任务,而非享受写作和整理的过程;
3️⃣ 看似不那么重要的一点——博客更新的流程有点麻烦 😅。

我之前的写作流程:

草稿(Obsidian)➡️ 正式定稿 ➡️ 登录 XFTP 上传文件 ➡️ 编译文件。可以看出,除了写作本身,上传文件和编译的步骤也进一步引发我本身的惰性。为了解决这个问题,我不断摸索优化流程:

  • 本地同步:在常用电脑上新建一个与博客服务器同步的文件夹,实现一键上传和编译;
  • 跨设备书写:利用 Obsidian 笔记软件的丰富插件,支持随时随地写作,并通过 FreeFileSync 实现主电脑与其他设备的文件对比和同步;
  • 自动化编译:使用 inotifywait 检测文件变化,自动执行编译命令,从而显著简化操作流程 🎉。

不过,优化流程只是缓解表面问题,真正的核心在于提升写作的积极性,享受写作、整理和思考的过程。 如果能把写博客视为一种有趣的记录和表达,而不是单纯的任务,就会更轻松、自然,也更有成就感!✍️✨ 顺带给自己立个 flag,每年至少写 24 篇,每个月至少 2 篇!😕

inotifywait

Inotify  一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。

inotify-tools  是一个 C 库和一组命令行的工作提供 Linux 下 inotify 的简单接口。inotify-tools 安装后会得到  inotifywait  和  inotifywatch  这两条命令:

  • inotifywait 命令  可以用来收集有关文件访问信息,Linux 发行版一般没有包括这个命令,需要安装 inotify-tools,这个命令还需要将 inotify 支持编译入 Linux 内核,好在大多数 Linux 发行版都在内核中启用了 inotify。
  • inotifywatch 命令  用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

安装

我们需要启用 EPEL 软件源并安装 inotify-tools 软件包。切记使用具有 sudo 权限的用户执行所有这些步骤。

# Install on CentOS 7 system
sudo yum install epel-release
sudo yum install inotify-tools

使用

#!/bin/bash

# 监控的文件或文件夹
projectDir="/home/aliyun/MyBlog/content"

# 使用 inotifywait 以递归 (-r)、静默 (-q) 或连续 (-m) 方式监控目录、
# 和连续 (-m) 监控特定事件(创建、删除、修改)。
# --format 选项指定只输出事件类型。
# 选项--exclude 可防止监控交换文件(如文本编辑器创建的 .swp 文件)。
inotifywait "$projectDir" -mrq --format '%e' --event create,delete,modify --exclude '^.*\.swp$' | while read -r event

do
    # 读取事件并检查它是否是受监控事件之一 (增,删,改).
    case "$event" in

        MODIFY*|CREATE*|DELETE*)
            # 如果发生任何监控事件,则导航到 Hugo 项目目录
            # 并重建网站。Hugo 命令的输出,包括任何错误、
            # 会记录到 auto_inotifywait.log 文件中。
            cd /home/aliyun/MyBlog && hugo -D > /home/aliyun/MyBlog/history_content/auto_inotifywait.log 2>&1
            ;;
    esac
done

接着运行nohup /bin/bash /home/aliyun/MyBlog/auto_build.sh > /home/aliyun/MyBlog/history_content/auto_inotifywait.log 2>&1 &开启,具体解释如下:

选项 解释
nohup 代表 “不挂断”。该命令允许脚本在终端关闭或用户注销的情况下继续运行。它基本上断开了进程与终端的连接。 📴
/bin/bash 指定用于执行脚本的 shell。在本例中,它使用 Bash shell。 🖥️
> 将脚本的标准输出(stdout)重定向到文件。在本例中,输出将重定向到 auto_inotifywait.log。 📂
2>&1 将标准错误 (stderr) 重定向到与标准输出相同的文件。这意味着 stdout 和 stderr 将被记录在同一个日志文件中。 📝
& 在后台运行命令。这允许用户继续使用终端,甚至关闭终端,而不会中断正在运行的脚本。 🔄

FreeFilesSync

安装

FreeFileSync 是一款用于文件同步的开源软件,支持 Windows、Linux 和 macOS 三个主要操作系统。FreeFileSync 的工作原理是比较一个或多个文件夹的内容、日期或文件大小,然后根据用户的设置来同步内容。除了支持本地文件和网络文件同步,FreeFileSync 还能够将文件同步到FTPFTPSSFTPMTP 设备。

使用

选定好左侧的本地文件路径,右侧的服务器路径,点击比较按钮显示文件差异,直接点击同步即可。(注意 🔕:同步的文件夹路径仅为博客内容所在 content 文件目录,毋需同步整个 Hugo 根目录内容,否则会导致对比时间过长或服务器运行错误!)

📖 参考文献

  1. Linux | inotifywait 异步文件系统监控机制
  2. 后端 - 如何用 Shell 监控文件变化?
  3. Directory and file monitoring in CentOS 7 with inotify | by Daniel Aguilar | Medium
  4. inotifywait 的安装及基本使用-CSDN 博客