Dbus PHP无法在没有$ DISPLAY的情况下为X11启动dbus-daemon

时间:2011-12-19 03:20:30

标签: php dbus

我正在尝试使用GREE Labs' Dbus PHP Extension创建一个能够创建桌面通知的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   连接对象[无法在没有a的情况下自动启动dbus-daemon   在[...第39行的COI / GTK / Notify.php

中显示X11的$ DISPLAY

这是我第一次使用与dbus相关的任何东西,而我很失落。

我的目标是在终端中执行以下操作时产生的效果类似(在Ubuntu 11.10上):

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

我最初使用notify-send& exec,但当我找到GREE Dbus扩展时切换,因为我认为它可以提供更清晰的界面。另外notify-send只有在我将我的apache用户改为与我当前登录的用户相同时才能正常工作 - 不是理想的解决方案。

是否有人能够告诉我实现我想要的结果需要哪些修改,或者告诉我,我想做什么实际上是不可能的?

或者,我应该采取另一种方式吗?

2 个答案:

答案 0 :(得分:3)

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的另一种非常有用的方法

eval 'dbus-launch --auto-syntax' [command]

我在树莓派上使用它来运行我的自定义dbus守护程序。 dbus-launch --auto-syntax是一个命令,用于输出bash中适用于dbus的环境变量和文件。 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 :(得分:1)

在启动Web服务器的脚本中使用dbus-launch,以便同时启动相应的DBus守护程序。有关详细信息,请参阅dbus-launch(1)手册页。