如何知道哪个文件或 inode 触发了 systemd.path 单元?

Tim*_*Tim 13 linux inotify systemd

Systemd 提供了通过 inotify 控制特定路径监视的单元文件:systemd.path(5). 如果在监视路径中修改了文件或目录,systemd.service(5)则调用相应的。

根据inotify(7)手册页:

为了确定发生了什么事件,应用程序从 inotify 文件描述符中读取 (2)s。如果到目前为止没有事件发生,那么,假设一个阻塞的文件描述符,read(2) 将阻塞直到至少一个事件发生(除非被信号中断,在这种情况下调用失败并显示错误 EINTR;参见信号(7) ))。

每次成功的 read(2) 都会返回一个包含以下一个或多个结构的缓冲区:

      struct inotify_event {
          int      wd;       /* Watch descriptor */
          uint32_t mask;     /* Mask of events */
          uint32_t cookie;   /* Unique cookie associating related
                                events (for rename(2)) */
          uint32_t len;      /* Size of name field */
          char     name[];   /* Optional null-terminated name */
      };
Run Code Online (Sandbox Code Playgroud)

因此,如果 systemd 看到监视路径发生变化,是否有办法从read(2)命令中获取任何数据?值得注意的是我需要的name[]使用作为参数传递给该命令的ExecStart=systemd.service(5)单元发言。

[Service]
ExecStart=/usr/bin/command --file=$inotifyName
Run Code Online (Sandbox Code Playgroud)

dom*_*son 1

Steward在 unix.stackexchange.com 上安静地提出了合理的解决方法

经过一番尝试后,我发现最简单的方法是每个路径使用一个 *.path 文件,并将每个路径模板化为单个 *@.service 文件。

干杯