Я использую крейт автобус, чтобы сервер мог получать события из dbus. Это работает хорошо, мой код (в основном такой же, как пример из документации) может получать события, так что все в порядке.
Я использую busctl
для отправки события, как в примере:
busctl --user call org.zbus.MyGreeter /org/zbus/MyGreeter org.zbus.MyGreeter1 SayHello s "Maria"
И мой код может нормально получать событие с параметром.
Дело в том, что у меня некоторые проблемы с udev, и пока я пытался это исправить, я обнаружил несколько странных вещей:
Call failed: the name org.zbus.MyGreeter was not provided by any .service files
, пока моя программа работает.busctl list --acquired
я не вижу org.zbus.MyGreeter
в результатеМой вопрос: это нормально, что моя программа не отображается в списке busctl? Я делаю что-то не так или использую не ту библиотеку, чтобы делать то, что хочу?
Хорошо, кажется, есть 2 шины, и я не использовал системную шину.
Мне пришлось заменить метод session
на system
, чтобы указать, что я хочу, чтобы моя программа работала на системной шине.
Как это:
let _ = ConnectionBuilder::system()?
.name("org.zbus.MyGreeter")?
.serve_at("/org/zbus/MyGreeter", greeter)?
.build()
.await?;
Этого недостаточно, потому что моей программе не нужно разрешение на создание службы в шинной системе. Поэтому мне пришлось создать файл в /usr/share/dbus-1/system.d
, где я написал необходимый конфигурация.
Существует как минимум два запущенных экземпляра D-Bus: «системный» экземпляр, доступный для всех, и «пользовательские» экземпляры для каждого пользователя. Поскольку ваша программа подключается к «пользовательской» шине, она доступна только для этого конкретного пользователя, а не для других пользовательских шин.