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

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

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

根据inotify(7)手册页:

为了确定发生了哪些事件,应用程序会从 inotify 文件描述符中读取 (2)。如果到目前为止没有发生任何事件,那么假设文件描述符阻塞,read(2) 将阻塞,直到至少发生一个事件(除非被信号中断,在这种情况下调用失败并出现错误 EINTR;请参阅 signal(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 */
      };

因此,如果 systemd 发现监视路径发生变化,是否有办法从命令中获取任何数据read(2)?值得注意的是,我需要将用作 unit 语句中name[]命令的参数。ExecStart=systemd.service(5)

[Service]
ExecStart=/usr/bin/command --file=$inotifyName

答案1

管家给出了一个合理的完整解决方案在 unix.stackexchange.com 上

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

干杯

相关内容