Не удалось послать сообщение d bus

Обновлено: 06.07.2024

systemd уже был частью дистрибутива .. Я только что добавил новый файл модуля my-daemon.service в /etc/systemd/system/ но после перезагрузки я получаю эту ошибку независимо от того, что я делаю. Работало до перезагрузки

Также попытались удалить файл модуля my-daemon.service и перезагрузили систему. Но все равно получаю ту же ошибку

2 ответа 2

разрешение

объяснение

Failed to get D-Bus connection: Unknown error -1 означает, что systemd не работает.

Вот моя установка LMDE 2, которая очень похожа на Debian 8:

В вашей системе /sbin/init вероятно, не является символической ссылкой, указывающей на /lib/systemd/systemd . Вот как это выглядит на LMDE 2:

Вот как это выглядит в Ubuntu 16.04 LTS, которая по умолчанию запускает systemd:

Чтобы решить эту проблему, замените пакет sysvinit-core на systemd-sysv :

Теперь перезагрузитесь с reboot .

После перезагрузки системы вы запустите systemd вместо SysV:

Возможная причина?

Вы указали, что systemd в вашей установке Debian работал в прошлом. Возможно, что пакет или его зависимости потребовали SysVinit вместо systemd и стерли или отключили systemd.

Это руководство не завершено. Оно, вероятно, содержит некоторую полезную информацию, но также имеет много пробелов. Прямо сейчас вам также необходимо обратиться к спецификации D-Bus, справочной документации Doxygen и посмотреть несколько примеров того, как другие приложения используют D-Bus.

Определенно, приветствуется улучшение руководства - отправляйте свои исправления или предложения в список рассылки. Если вы создаете привязку D-Bus, пожалуйста, добавьте раздел в учебник для вашей привязки, хотя бы небольшой раздел с парой примеров.

Что такое D-Bus?

D-Bus - это система межпроцессного взаимодействия (IPC). Архитектурно он имеет несколько слоев:

Библиотеки враперов или привязок основанных на частичном применении конкретных фреймворков. Например, libdbus-glib и libdbus-qt. Также существуют привязки к таким языкам, как Python. Эти библиотеки-враперы представляют собой API-интерфейс, который следует использовать большинству людей, поскольку это упрощают детали программирования D-Bus. libdbus предназначена для низкоуровневого бэкенда в привязках более высокого уровня. Большая часть API libdbus полезна только для реализации привязок.

Применения D-Bus

Связь между настольными приложениями в одном рабочем столе; для обеспечения интеграции сеанса рабочего стола в целом и решения проблем жизненного цикла процесса (когда компоненты рабочего стола запускаются и останавливаются).

Связь между сеансом рабочего стола и операционной системой, где операционная система обычно включает ядро и любые системные демоны или процессы.

Для случая использования в рамках сеанса рабочего стола рабочие столы GNOME и KDE имеют значительный предыдущий опыт работы с различными решениями IPC, такими как CORBA и DCOP. D-Bus основан на этом опыте и тщательно адаптирован для удовлетворения потребностей, в частности, таких настольных проектов. D-Bus может подходить или не подходить для других приложений; в FAQ есть некоторые сравнения с другими системами IPC.

Проблема, решаемая общесистемным случаем или случаем связи с ОС, хорошо объясняется следующим текстом из проекта Linux Hotplug:

D-Bus может оказаться полезным для целей, отличных от тех, для которых он был разработан. Есть общие свойства, которые отличают его от других вариантов IPC:

Двоичный протокол, предназначенный для асинхронного использования (в духе протокола X Window System);

Постоянные и надежные соединения остаются открытыми все время;

Многие вопросы реализации и деплоя описаны, а не остаются неоднозначными / настраиваемыми / подключаемыми.

Семантика подобна существующей системе DCOP, что позволяет KDE легко ее адаптировать.

Концепции

Некоторые базовые концепции применимы независимо от того, какую платформу приложения вы используете для написания приложения D-Bus. Однако конкретный код, который вы напишете, будет отличаться для приложений GLib, Qt и Python.

Вот диаграмма, которая может помочь вам наглядно представить следующие концепции.

Нативные объекты и пути к объектам

Протокол D-Bus низкого уровня и соответствующий API libdbus не оперирует нативными объектами. Однако он предоставляет концепцию, называемую путем к объекту. Идея пути к объекту заключается в том, что привязки более высокого уровня могут давать имена экземплярам собственных объектов и позволяет удаленным приложениям обращаться к ним.

Путь к объекту выглядит как путь в файловой системе, например, объект может называться

. Удобочитаемые пути - это хороший тон, но вы можете создать объект с именем

, если это имеет смысл для вашего приложения.

Разумно начинать пути к объектам с их пространств имен - с компонентов вашего доменного имени (например,

). Благодаря этому разные модули кода в одном процессе не будут мешать друг другу.

Методы и сигналы

Интерфейсы

Каждый объект поддерживает один или несколько интерфейсов. Понимайте интерфейс как именованную группу методов и сигналов, как в GLib, Qt или Java. Интерфейсы определяют тип экземпляра объекта.

D‑Bus идентифицирует интерфейсы с помощью простой строки с именами, например

. Большинство привязок будут непосредственно отображать эти имена интерфейсов на соответствующую конструкцию языка программирования, например, на интерфейсы Java или чистые виртуальные классы C++.

Прокси

В псевдокоде программирование без прокси может выглядеть так:

Программирование с использованием прокси может выглядеть так:

Шинные имена

Когда приложение подключается к демону шины, который немедленно присваивает ему имя, называемое уникальным именем подключения. Уникальное имя начинается с символа ‘:’ (двоеточия). Эти имена никогда не используются повторно во время существования шинного демона — то есть вы знаете, что данное имя всегда будет относиться к одному и тому же приложению. Примером уникального имени может быть “:34–907”. Цифры после двоеточия не имеют другого значения, кроме их уникальности.

Когда имя сопоставляется с подключением определенного приложения, считается, что это приложение владеет этим именем.

Приложения могут запрашивать дополнительные общепринятые (well-known) имена. Например, вы можете написать спецификацию для определения имени

. В вашем определении можно указать, что для владения этим именем приложение должно иметь объект с путём

Вы можете думать об уникальных именах как об IP-адресах, а об общепринятых именах как о доменных именах. Таким образом,

может отображаться например как

сопоставляется с чем-то вроде

, закрывайте приложение текстового редактора, если такое шинное имя уже имеет владельца.

Адреса

Если вы, используете демон шины, ваше приложение будет клиентом демона шины. То есть демон шины прослушивает соединения, а ваше приложение инициирует соединение с демоном шины.

D-Bus адрес указывает, где сервер будет слушать, и куда будет подключаться клиент. Например, адрес

указывает, что сервер будет прослушивать сокет домена UNIX с путём

и клиент будет подключаться к этому сокету. Адрес может также определять TCP/IP сокеты или любой другой транспорт, который будет определен в будущих итерациях спецификации D-Bus.

Если вы используете D-Bus без демона шины, вам решать, какое приложение будет сервером, а какое — клиентом, а также указать механизм для согласования адреса сервера. Это нетипичный случай.

Большая концептуальная картина

Собирая все эти концепции воедино, для вызова конкретного метода для конкретного экземпляра объекта, необходимо назвать несколько вложенных компонентов:

Шинное имя указано в квадратных скобках, чтобы указать, что оно необязательно — вы указываете имя только для маршрутизации вызова метода в нужном приложение при использовании демона шины. Если у вас есть прямое соединение с другим приложением, то демон шины отсутствует и шинные имена не используются.

Интерфейс также не является обязательным, в первую очередь по историческим причинам; DCOP не требует указания интерфейса, вместо этого просто запрещает дублирование имен методов в одном экземпляре объекта. Таким образом, D-Bus позволит вам не указывать интерфейс, но если имя вашего метода неоднозначно, то не определено, какой метод будет вызван.

За кулисами вызова метода

Вызов метода в D-Bus происходит следующим образом:

За кулисами излучения сигнала

Сигнал в D‑Bus передается следующим образом:

Каждый процесс, получивший сигнал, решает, что с ним делать; при использовании привязки, привязка может излучать нативный сигнал для прокси-объекта. При использовании низкоуровневого API процесс может просто взглянуть на отправителя сигнала и имя и решить, что делать на основании этого.

Интроспекция

Объекты D-Bus могут поддерживать интерфейс

У этого интерфейса есть один метод Introspect, который не принимает аргументов и возвращает строку XML. Строка XML описывает интерфейсы, методы и сигналы объекта. См. Спецификацию D-Bus для получения более подробной информации об этом формате интроспекции.

GLib API

Рекомендуемый GLib API для D-Bus — GDBus, который распространяется с GLib начиная с версии 2.26. Здесь это не задокументировано, для получения подробной информации о том, как использовать GDBus см. Документацию GLib по ссылке:

Также существует более старый API, dbus-glib. Он устарел и не должен использоваться в новом коде. По возможности также рекомендуется переносить существующий код из dbus-glib в GDBus.

Python API

Python API, dbus-python, теперь документирован отдельно в руководстве dbus-python

(также доступен в doc/tutorial.txt и doc/tutorial.html, если он собран с помощью python-documenttils, в исходном дистрибутиве dbus-python).

Qt API

Привязка Qt для libdbus, QtDBus, распространяется с Qt начиная с версии 4.2. Здесь это не задокументировано. Для получения подробной информации о том, как использовать QtDBus см. документацию Qt

Если вы достаточно давно пользуетесь операционной системой Linux, то, наверное, уже не раз слышали о сервисе DBus. Он фигурирует в различных логах программ, инструкциях по настройке системы, а также вы можете видеть сервис DBus-daemon, который непонятно зачем загружается при старте системы.

В этой статье мы попытаемся разобраться, что такое DBus, зачем он нужен, а также как его можно использовать для эффективного управления приложениями в системе.

Что такое Dbus?

Dbus или Desktop Bus - это система, которая используется в основном в операционной системе Linux для того, чтобы различные приложения и сервисы могли общаться между собой. Но с помощью Dbus могут взаимодействовать не только приложения, но и пользователи с приложениями.

По сути, DBus состоит из управляющего демона, API для языков программирования, с помощью которых приложения могут взаимодействовать с системой и консольного клиента.

Объекты Dbus

Путь объекта DBus состоит из трех частей:

Несколько примеров объектов:

Интерфейсы имеют очень похожий путь на путь объекта, в некоторых случаях, имя интерфейса совпадает с именем объекта, но если интерфейсов несколько, то они могут отличаться. В отличие от объекта имя интерфейса разделено слэшем. Вот несколько примеров имен интерфейсов, в скобках я привел объекты, в которых есть эти интерфейсы:

  • /org/mpris/MediaPlayer2/Player (org.mpris.MediaPlayer2.VLC)
  • /org/PluseAudio/ServerLookup1 (org.PluseAudio1)

Доступные объекты Dbus

sudo apt install qttools5-dev-tools

Запустив программу через главное меню вы увидите вот такое главное окно:

dbus

Здесь вы можете увидеть на левой панели список доступных объектов, на правой - пути к интерфейсу внутри объекта и методы. Внизу консоль, в которую выводится информация об успешности ваших действий.

Как использовать Dbus?

Обращаться к сервисам Dbus можно с помощью консольной утилиты dbus-send. Рассмотрим ее синтаксис:

$ dbus-send опции --dest адрес_объекта интерфейс метод параметры

Рассмотрим опции утилиты:

Получаем список сетевых адаптеров NetworkManager:

Включим музыку в плеере VLC:

dbus-send --print-reply --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play

Поставим на паузу:

dbus-send --print-reply --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause

Здесь org.mpris.MediaPlayer2.vlc - объект, интерфейс - /org/mpris/MediaPlayer2, метод - org.mpris.MediaPlayer2.Player.Pause

Методы могут получать параметры, например, перемотаем наш трек на несколько секунд:

dbus-send --print-reply --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Seek int64:10000000

Узнать тип переменной можно тоже с помощью qdbusviewer. Кликните по методу правой кнопкой и выберите Call, в открывшемся диалоговом окне будет предложено ввести значение переменной, а также указан ее тип.

Кроме методов, здесь есть переменные. Понять с чем мы имеем дело, методом или переменной можно тоже с помощью qdbusviewer. Для методов будет написано method, для переменных property. Но посмотреть значение переменной не так просто, для этого используется такая конструкция:

dbus-send --print-reply --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Volume

Вместо того чтобы обратиться напрямую к переменной интерфейса, мы используем метод org.freedesktop.DBus.Properties.Get объекта /org/mpris/MediaPlayer2 и передаем ему две строки. Имя интерфейса и имя переменной. Данный пример показывает, как посмотреть текущую громкость VLC.

Установить значение переменной еще сложнее. Для этого используется метод org.freedesktop.DBus.Properties.Set:

dbus-send --print-reply --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Set string:org.mpris.MediaPlayer2.Player string:Volume variant:double:1.1

Пример изменяет громкость воспроизведения VLC. Этот метод принимает уже три параметра две уже знакомые нам строки и новое значение переменной. Значение переменной имеет тип variant и ему нужно задать нужный тип переменной, в нашем случае нужна double. Посмотреть какой тип переменной нужен вам можно в qdbusviewer, кликните по переменной правой кнопкой мыши и нажмите Set Value. Здесь кроме поля ввода значения вы увидите нужный тип переменной.

Выводы

Теперь вы знаете не только что такое Dbus, но и все необходимые основы, чтобы использование Dbus было для вас достаточно простым в вашей системе и вы могли применять его на полную для управления своими программами. Нашли интересную команду Dbus, которая будет полезна другим пользователям? Напишите в комментариях!

Николай Кондратьев


Николай Кондратьев

Никита Жирков


Никита Жирков

Иван, ну ты может и сиди на Windows и жди пока твои данные сольют, якобы для "улучшения оболочки Windows" , а я хочу сидеть под надёжной ОС которая поминимуму будет шпионить за мной.

Zero Point

Никита,

Влад Журавлёв

Илья Князев

Никита Жирков


Никита Жирков

Евгений Кунгуров

Zero Point

Никита Жирков


Никита Жирков ответил Zero

Никита Жирков


Никита Жирков ответил Евгению

Zero Point

Никита, Нафиг она тебе как основная? Там же можно в лайв режиме с флешки грузится!

Поставь хотя бы Убунту или Манжаро / Арч, как основную

Влад Журавлёв

Никита, попробуй de переустановить. А лучше поставь нормальную систему. Опять же, если kde, есть плазмоиды для панели

Никита Жирков


Никита Жирков ответил Влад

Влад Журавлёв

Никита Жирков


Никита Жирков ответил Влад

Влад Журавлёв

Никита Жирков


Никита Жирков ответил Влад

Влад Журавлёв

Рома Лисицкий


Рома Лисицкий ответил Никите

Никита Поддубных


Никита Поддубных ответил Никите

Никита, ого, чё ж ты там такое хранишь, что боишься слива? Коды от ядерного чемоданчика?

Евгений Яценко

Алексей Сильвейструк


Алексей Сильвейструк

Сам вот сижу на калочке, тоже однажды пропало, но перезагрузка всё решила, если не поможет, то тут только настройки

Никита Жирков


Никита Жирков

Алексей Сильвейструк


Алексей Сильвейструк ответил Никите

Василий Шогов


Василий Шогов

Зачем лезть в Линукс если сами не знаете что и как работает темболее в кали, сиди на Винде.
alt+f2, tweaktool \ application menu если нету.
sudo apt remove —purge
sudo apt install kali-menu -y
reboot

Никита Жирков


Никита Жирков

Читайте также: