Почему служба dbus работает неправильно? - PullRequest
0 голосов
/ 07 апреля 2019

Я просмотрел это , это , это и это и не смог найти ответ. Я пытаюсь реализовать Пример 5 из systemd.service , но он не работает. Конечно, причина в том, что я не совсем понял, как работает активация dbus. На мой взгляд, как только имя DBus начинает использоваться, служба активируется, и моя программа запускается. Я слишком далеко?

Итак, для тестирования я хотел, чтобы при запуске моей программы на python3, которая «использует» имя dbus, мой сервис запускался.

В любом случае, кто-нибудь может направить меня в нужное место? Мои файлы:

# 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 .: конечно, когда я запускаю свои server04.py и client04.py вручную с python, все работает.

1 Ответ

0 голосов
/ 15 апреля 2019

Ваш server04.py использует шину сеанса, но предоставленный вами файл системного блока и служебный файл D-Bus предназначены для системной шины.

Ни файл модуля, ни служебный файл не выполняют программу, которая фактически запрашивала бы заданное имя шины (org.mybus.demo.test), что заставит systemd считать, что модуль не запустился должным образом. Программа, выполняемая ExecStart=, должна запрашивать само имя шины D-Bus.

...