我调查了this,this,this和this,但找不到答案。我正在尝试从systemd.service实现示例5,但无法正常工作。当然,原因是我不太了解dbus激活的工作原理。在我看来,一旦开始使用DBus名称,便会激活服务并运行我的程序。我离得太远了吗?
因此,要进行测试,我希望当我运行“使用” dbus名称的python3程序时,将启动我的服务。
无论如何,有人可以引导我到正确的地方吗? 我的文件:
# cat /etc/systemd/system/mydbus.service
[Unit]
Description=Service Started by DBus name
[Service]
Type=dbus
BusName=org.mybus.demo.test
ExecStart=/bin/echo started
# ExecStart=/usr/bin/dbus-launch /usr/bin/python3 /home/myuser/Documents/dbus/client04.py
# the idea is that my python client up here will run once the server starts "consuming" the dbus name
[Install]
WantedBy=multi-user.target
以下是我的dbus服务(我认为):
# cat /usr/share/dbus-1/system-services/org.mybus.demo.test.service
[D-BUS Service]
Name=org.mybus.demo.test
Exec=/bin/echo started >> /home/myuser/Documents/dbus/org.mybus.demo.test
User=root
SystemdService=mydbus.service
现在我运行$ sudo journalctl -exfu mydbus
。在另一个终端上,我启动server04.py
:
# cat /home/myuser/Documents/dbus/server04.py
# Importing
from pydbus import SessionBus
from gi.repository import GLib
import time
# Variables / Constants / Instantiation...
bus = SessionBus()
BUS = "org.mybus.demo.test"
loop = GLib.MainLoop()
message_count = 0
class DBusService_XML():
"""
DBus Service XML Definition.
type = "i" for integer, "s" for string, "d" for double, "as" list of string data.
"""
dbus = """
<node>
<interface name="{}">
<method name='greeting'>
<arg type="s" name="input" direction="in">
</arg>
<arg type="s" name="output" direction="out">
</arg>
</method>
</interface>
</node>
""".format(BUS)
def greeting(self, clientName):
"Receive and send arg"
print("{} is asking for name".format(clientName))
return "Hello {}, Im Kyle".format(clientName)
if __name__ == "__main__":
bus.publish(BUS, DBusService_XML())
loop.run()
尽管如此,我的mydbus.service
将会启动,并且在journalctl中会看到“开始”,但是什么也没发生。那么,我该怎么做?
PS .:当然,当我使用python手动运行server04.py和client04.py时,一切正常。
答案 0 :(得分:0)
您的server04.py
正在使用会话总线,但是您提供的systemd单元文件和D-Bus服务文件是用于系统总线的。
单元文件或服务文件均未执行实际上会声明给定总线名称(org.mybus.demo.test
)的程序,这将导致systemd认为该单元未正确启动。 ExecStart=
执行的程序必须声明D-Bus名称本身。