Systemd 提供了通过 inotify 控制特定路径监视的单元文件:systemd.path(5). 如果在监视路径中修改了文件或目录,systemd.service(5)则调用相应的。
根据inotify(7)手册页:
为了确定发生了什么事件,应用程序从 inotify 文件描述符中读取 (2)s。如果到目前为止没有事件发生,那么,假设一个阻塞的文件描述符,read(2) 将阻塞直到至少一个事件发生(除非被信号中断,在这种情况下调用失败并显示错误 EINTR;参见信号(7) ))。
每次成功的 read(2) 都会返回一个包含以下一个或多个结构的缓冲区:
Run Code Online (Sandbox Code Playgroud)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)命令中获取任何数据?值得注意的是我需要的name[]使用作为参数传递给该命令的ExecStart=的systemd.service(5)单元发言。
[Service]
ExecStart=/usr/bin/command --file=$inotifyName
Run Code Online (Sandbox Code Playgroud)