我有一个用户空间守护进程(称为 )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服务。
应该可以将所有内容安装为用户服务(更改User
D-Bus 服务文件以匹配),但我还没有尝试过。