Dbus PHP не может запустить демон dbus без $ DISPLAY для X11 - PullRequest
3 голосов
/ 19 декабря 2011

Я использую расширение Dbus PHP GREE Labs в своих попытках создать класс PHP, способный создавать уведомления на рабочем столе.

$dbus = $dbus = dbus_bus_get(DBUS_BUS_SESSION);

$message = new \DBusMessage(DBUS_MESSAGE_TYPE_SIGNAL);
$message->setDestination("org.freedesktop.DBus");
$message->setAutoStart(true);

$dbus->sendWithReplyAndBlock($message, 1);

Когда мой код запускается, я получаю следующую ошибку:

Предупреждение: dbus_bus_get () [function.dbus-bus-get]: не удалось создать dbus объект соединения [Невозможно автоматически запустить демон dbus без $ DISPLAY для X11] в [... COI / GTK / Notify.php в строке 39

Это первый раз, когда я использовал что-либо, связанное с dbus, и я довольно потерян.

Я стремлюсь к эффекту, подобному тому, что происходит, когда в терминале выполняется следующее (в Ubuntu 11.10):

/usr/bin/notify-send -t 2000 'title' 'message'

Первоначально я использовал notify-send & exec, но переключился, когда нашел расширение GREE Dbus, так как думал, что оно может обеспечить более чистый интерфейс. Кроме того, notify-send будет работать правильно только в том случае, если я изменил своего пользователя apache на того же пользователя, на котором я в данный момент вошел - не идеальное решение.

Может ли кто-нибудь сказать мне, какие модификации необходимы для достижения желаемого результата, или же сказать мне, если то, что я хочу сделать, на самом деле невозможно?

Или есть другой способ, которым я должен это делать?

Ответы [ 2 ]

3 голосов
/ 19 июля 2013

Dbus не похож на запуск в среде командной строки без X. Это разочаровывает, но это то, что я написал в python, чтобы переопределить это.Все сводится к установке двух переменных окружения.

def run(self):
    os.environ['DBUS_SESSION_BUS_ADDRESS'] = "unix:path=/run/dbus/system_bus_socket"
    os.environ["DISPLAY"] = ":0"

    try:
        bus_name = dbus.service.BusName(INTERFACE,
                                    bus = dbus.SessionBus())
        dbus.service.Object.__init__(self, bus_name, 
                                    '/com/your/path/here')
        gobject.MainLoop().run()
    except Exception, E:
        f = file('/tmp/bus.log', 'a')
        f.write(str(E))
        f.close()

РЕДАКТИРОВАТЬ: я забыл еще один очень полезный способ запуска dbus в командной строкезапустить мой кастомный dbus deamons.dbus-launch --auto-syntax - это команда, которая выводит переменные окружения и файлы, применимые к dbus в bash.Команда eval возьмет этот вывод и оценит его, так что ваш command будет работать с этими переменными среды.

Простым тестом было бы выполнить что-то вроде этого:

eval 'dbus-launch --auto-syntax' python /usr/bin/my-dbus-daemon.py
eval 'dbus-launch --auto-syntax' qdbus org.dbus.method /org/dbus/method/test
1 голос
/ 19 декабря 2011

Используйте dbus-launch в сценарии, который запускает ваш веб-сервер, чтобы одновременно запустить соответствующий демон DBus.Подробнее см. Справочную страницу dbus-launch(1).

...