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

Posted

技术标签:

【中文标题】Dbus PHP 无法在没有 $DISPLAY for X11 的情况下启动 dbus-daemon【英文标题】:Dbus PHP Unable to Launch dbus-daemon Without $DISPLAY for X11 【发布时间】:2012-01-23 07:32:51 【问题描述】:

我正在使用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 连接对象 [无法自动启动 dbus-daemon 没有 $DISPLAY for X11] 在 [...COI/GTK/Notify.php 第 39 行

这是我第一次使用与 dbus 相关的任何东西,并且很迷茫。

我的目标是获得类似于在终端中执行以下命令时发生的效果(在 Ubuntu 11.10 上):

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

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

谁能告诉我需要进行哪些修改才能达到我想要的结果,或者告诉我我想要做的事情是否实际上是不可能的?

或者,我应该这样做吗?

【问题讨论】:

你可以试试:***.com/questions/2701059/… 【参考方案1】:

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

【讨论】:

或者在命令行:DISPLAY=":0" DBUS_SESSION_BUS_ADDRESS="unix:path=/run/dbus/system_bus_socket" /your/bin/program【参考方案2】:

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

【讨论】:

以上是关于Dbus PHP 无法在没有 $DISPLAY for X11 的情况下启动 dbus-daemon的主要内容,如果未能解决你的问题,请参考以下文章

无法在没有 $DISPLAY for X11 的情况下自动启动 dbus-daemon。网豆。 Pi 作为远程主机

无法启用 php display_errors

PHP exec |尝试设置DBUS_SESSION_BUS_ADDRESS时出现空字节错误

来自另一个用户的 DBus

无法取消注册 ble 通知的 dbus 信号

解释 DBus 消息