登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux systemd.path PathChanged 怎样监视目录项变化

来源:17golang原创

时间:2026-10-27 13:54:47 106浏览 收藏

在 .path 单元的 [Path] 段写 PathChanged=/绝对目录,再配一个被激活的 service,就能让 systemd 对目录变化作出响应。它适合提醒程序重新查看目录状态,不适合直接当作“每个文件事件都精确执行一次”的任务队列。

官方手册地址:https://www.freedesktop.org/software/systemd/man/latest/systemd.path.html

PathChanged 应该写在哪个单元里

下面以 inbox-watch.path 和 inbox-watch.service 为一对示例。PathChanged 指向监视目录,Unit 指定服务,服务以 oneshot 方式完成一次短任务。采用显式 Unit 有助于看清两者关系。

# 保存为 /etc/systemd/system/inbox-watch.path
[Unit]
Description=Watch sample inbox entries

[Path]
# 使用绝对路径;示例监视一个目录,不递归订阅整个目录树。
PathChanged=/var/lib/sample-inbox
Unit=inbox-watch.service

[Install]
WantedBy=multi-user.target
systemd path与service配置关联的原创结构图
原创结构图:path 单元保存监视配置,service 单元定义被激活的处理任务。

用配对服务接收目录变化提示

先用只记录提示的服务说明激活入口,避免把一个尚不存在的脚本写成开箱即用的处理程序。真正上线时再换成自己的扫描器,并按需要设置运行用户与权限。

# 保存为 /etc/systemd/system/inbox-watch.service
[Unit]
Description=Handle sample inbox change

[Service]
Type=oneshot
# 仅记录激活提示;上线时换成已部署且具有幂等性的扫描器。
ExecStart=/usr/bin/echo Inbox change noticed
# 管理员预先创建示例目录,处理程序的输出应放在监视目录之外。
sudo mkdir -p /var/lib/sample-inbox
# 放好两个单元文件后,加载配置并启动监视单元。
sudo systemctl daemon-reload
sudo systemctl enable --now inbox-watch.path
# 这些命令供读者观察状态,不代表本文已在主机执行。
systemctl status inbox-watch.path inbox-watch.service
journalctl -u inbox-watch.service --no-pager

上述命令用于目标 Linux 环境,本文未实际启用服务。提示文本只说明服务收到激活机会,不证明某个文件已经写完或处理成功。

现象或需求理解方式
想观察目录项增删或改名监视包含这些条目的目录
只关心某个已知文件的修改可直接监视该文件,具体行为按对应指令选择
服务结束后显示 inactive短 oneshot 任务结束可以是正常状态,同时看退出结果

为什么不能把它当作逐文件任务队列

inotify 的目录监视不是递归订阅,不能凭父目录监视就保证覆盖任意深度的变化;相同事件还可能合并。因此,业务应设计扫描器读取目录当前状态,用完成标记区分仍在写入的文件,以幂等处理和已处理记录识别待处理文件。这些是应用设计职责,不是 .path 自动提供的功能。

目录扫描器与幂等处理职责原创结构图
原创结构图:业务扫描器根据当前状态识别待处理文件,幂等与记录由应用负责。

一个实用约定是生产者在其他位置完成写入,再发布成品或完成标记;消费者输出与日志放到监视目录外,减少自己写入又触发扫描的循环。服务忙碌期间发生的变化也不能据此推断会逐条排队重放,扫描器应能够重新核对当前状态。

PathChanged 与 PathModified 有什么不同?针对被监视文件,前者关注写入后关闭,后者还响应简单写入;不要据此推断目录中的每个文件都已经完整可用。启动监视时目录已有文件会立即处理吗?PathChanged 不因目录已经存在就自动完成初始扫描,业务需要另外安排。远端 NFS 写入能可靠吗?官方说明基于 inotify 的限制,不能用于监视其他机器在远端 NFS 上造成的变化;需要另选同步或轮询机制。

参考:systemd.path 官方说明、Linux inotify 手册。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>