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 文件。
干杯