首页/系统/Linux 运维命令速查/path unit 目录/文件变化触发
systemd 与服务42 条

path unit 目录/文件变化触发

用路径变化替代轮询:PathExists/PathChanged/DirectoryNotEmpty 触发对应 service,适合「文件一到位就处理」的流水线。

Linux 运维命令速查系统更新于 2026-10-13

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 单元监控同一个目录时,事件可能重复触发:把处理逻辑做成幂等的,比试图精确控制触发次数更实用。

易错点

  • 服务失败后 path 不再触发:任务静默停止,需要主动检查单元状态
  • 被监控目录一直非空:反复触发同一批处理,做重复劳动
  • 监控超大目录树而不评估 inotify 上限:事件丢失,处理不完整
  • 把 path 单元当可靠队列使用:它没有持久化与重试语义,漏处理难以发现

数据来源与参考

  • man 5 systemd.path
  • man 5 systemd.timer(对比轮询)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌