简体   繁体   中英

Why is dbus service not functioning correctly?

I looked into this , this , this and this and couldn't find an answer. I'm trying to implement Example 5 from systemd.service but it's not working. Of course the reason is that I didn't quite understand how dbus activation works. In my mind, once a DBus name starts being used, a service would be activated and my program would run. Am I too far off?

So, to test, I wanted that when I run my python3 program which "uses" a dbus name, my service would be started.

Anyways, can anyone direct me to the right place? My files:

# 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

Below is my dbus service (I think):

# 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

Now I run $ sudo journalctl -exfu mydbus . On another terminal, I start my 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()

I though that by doing that, my mydbus.service would start and I would see "started" in journalctl, but nothing happened. So, how do I do that?

PS.: of course that when I run my server04.py and client04.py manually with python, everything works.

Your server04.py is using the session bus, but the systemd unit file and D-Bus service file you've provided are for the system bus.

Neither the unit file or the service file execute a program which would actually claim the given bus name ( org.mybus.demo.test ), which will cause systemd to think the unit has not started properly. The program executed by ExecStart= must claim the D-Bus name itself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM