path unit 是什么
systemd 的 path 单元用文件系统事件替代轮询:PathExists、PathChanged、DirectoryNotEmpty 等条件满足时触发同名的 service。它适合「文件一到位就处理」的流水线,比如上传落盘后立刻转码、日志就绪后立即归档。相比定时轮询,它响应更快,也不产生空跑的调度开销。
基本信息
| 用途 | 用文件系统事件驱动服务触发 |
|---|---|
| 常用指令 | PathExists、PathChanged、PathModified、DirectoryNotEmpty |
| 激活方式 | path 单元与同名 service 配对 |
| 底层机制 | inotify,受系统实例数上限约束 |
典型使用场景
- 上传目录一有文件就启动处理脚本
- 配置变更后自动重载服务
- 日志切片落盘后立刻归档
- 依赖文件出现后按顺序启动后续单元
- 替代分钟级轮询,降低空跑开销
- 队列目录消费场景的轻量实现
完整示例
完整示例
# /etc/systemd/system/spool-watch.path
[Unit]
Description=watch incoming files
[Path]
DirectoryNotEmpty=/var/spool/incoming
[Install]
WantedBy=paths.target
# /etc/systemd/system/spool-watch.service
[Service]
Type=oneshot
ExecStart=/opt/scripts/process-incoming.sh
# 启用与查看
sudo systemctl daemon-reload && sudo systemctl enable --now spool-watch.path
systemctl list-units --type=path --no-pager常用触发指令
| 指令 | 触发条件 | 典型用途 |
|---|---|---|
| PathExists | 路径出现 | 等待依赖文件就绪 |
| PathChanged | 路径内容变更 | 文件改写后触发处理 |
| PathModified | 路径被修改 | 包含属性变化 |
| DirectoryNotEmpty | 目录非空 | 队列式消费 |
| Unit= | 指定触发的服务 | 默认触发同名 service |
inotify 有实例数上限:监控大目录树之前先评估上限是否够用,不够时退化为 timer 周期扫描反而更稳妥。
单元进入 failed 状态之后就再也收不到触发:脚本要保证正常退出,或在服务单元里配置重启策略。
DirectoryNotEmpty 触发后如果目录没有被清空,会反复触发:处理逻辑要负责消费到空,必要时引入节流与去重。
按事件触发并不等于可靠:文件可能在处理期间被覆盖,也可能在上次失败后再没人处理;对数据完整性有要求的流水线要配合幂等设计与定期兜底扫描。
多个 path 单元监控同一个目录时,事件可能重复触发:把处理逻辑做成幂等的,比试图精确控制触发次数更实用。