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

用配对服务接收目录变化提示
先用只记录提示的服务说明激活入口,避免把一个尚不存在的脚本写成开箱即用的处理程序。真正上线时再换成自己的扫描器,并按需要设置运行用户与权限。
# 保存为 /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 上造成的变化;需要另选同步或轮询机制。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
432 收藏
-
236 收藏
-
390 收藏
-
225 收藏
-
452 收藏
-
469 收藏
-
195 收藏
-
102 收藏
-
304 收藏
-
488 收藏
-
106 收藏
-
490 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习