如何仅在特定应用程序运行时运行守护进程?

如何仅在特定应用程序运行时运行守护进程?

我有一个用户空间守护进程(称为 )maxwell,它根据来自另一个应用程序(称为 )的 D 总线信号执行各种操作room。我想maxwell在用户启动时立即运行room,并在退出时停止room

我认为像这样的启动器脚本会产生所需的行为:

#!/bin/sh

systemctl --user start maxwell
room
systemctl --user stop maxwell

但有没有更好/标准的方法来做到这一点,例如通过 systemd 本身?

更新:我正在寻找的功能似乎与upstart它过去提供的功能类似总线事件systemd根据 Stephen Kitt 的回答,可以实现的最接近的事情似乎是在第一次使用某个 D 总线名称时自动启动一个“拥有”该名称的服务;不幸的是,在这种情况下,它room“拥有”这个名字。


笔记:我不认为这与systemd 需要=“一些非systemd 进程”?或者,至少其中提供的答案在这种情况下有效。据我了解,使用ExecStartPre只会将maxwell单位标记为失败的如果room还没有运行。

答案1

系统支持D-总线激活,其中启动服务来为 D-Bus 方法调用提供服务。我不确定这是否可以移植到用户服务中;对于系统服务,您创建一个 D-Bus 服务文件:

[D-BUS Service]
Name=your.bus.name
Exec=/path/to/the/daemon
User=root
SystemdService=systemd-service-name.service

以及相应的 systemd 服务,它必须指定匹配的总线名称:

[Service]
BusName=your.bus.name

指定BusName这样就自动将该服务标记为D-Bus服务。

应该可以将所有内容安装为用户服务(更改UserD-Bus 服务文件以匹配),但我还没有尝试过。

相关内容