我有一个名为的用户空间守护程序,该守护程序maxwell
根据来自另一个应用程序的D总线信号执行各种动作,称为room
。我想maxwell
在用户启动后立即运行room
,并在room
退出时停止运行。
我认为像这样的启动器脚本将导致所需的行为:
#!/bin/sh
systemctl --user start maxwell
room
systemctl --user stop maxwell
但是有没有更好/标准的方法来做到这一点,例如通过systemd本身呢?
更新:似乎我正在寻找的功能类似于upstart
其dbus event所提供的功能。根据systemd
史蒂芬·基特(Stephen Kitt)的回答,在首次使用某个D-bus名称时,似乎可以自动实现的服务是该名称的“拥有”。不幸的是,在这种情况下,名称是room
“拥有”的。
注意:我认为这与systemd require =“ some non-systemd process”不同吗?或者至少在此情况下提供的答案有效。据我了解,如果尚未运行,使用ExecStartPre
只会将其标记maxwell
为失败room
。
systemd支持D-Bus激活,其中启动了一项服务以服务于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服务文件中进行更改以匹配),但是我还没有尝试过。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句