【问题标题】:Best way to make sure udisksd is running确保 udisksd 正在运行的最佳方法
【发布时间】:2017-09-21 14:17:01
【问题描述】:

我正在为 Raspberry Pi 编写一个程序,当用户插入 USB 驱动器时需要通知该程序。我正在使用 Qt 的 D-Bus 支持来收听 InterfacesAdded from org.freedesktop.UDisks2,它在我的 x86 Linux 桌面上运行良好。

这是我将 D-Bus 信号设置到班级插槽的代码:

auto bus = QDBusConnection::systemBus();
auto monitor = new UsbMonitor(&app);   // my class

if (!bus.connect("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "InterfacesAdded",
            monitor, SLOT(handleit(QDBusObjectPath, QMap<QString,QVariant>)))) {
    qFatal("FATAL Couldn't connect USB monitor to D-Bus signal");
}

它不适用于 Pi。我追查到 udisksd 没有运行这一事实,即使它应该在需要时自动启动。

我猜是因为我启动到控制台(不是 GUI)并且只添加了一个信号处理程序,这还不足以让 D-Bus 自动启动 udisksd。

如果我添加

auto msg = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
bus.call(msg);

在我致电 bus.connect 之前,一切正常。

有没有更好的方法来确保 udisksd 正在运行?我宁愿更改 Pi 上的配置文件,也不愿为了“唤醒”服务而编写额外的代码。

【问题讨论】:

    标签: linux qt dbus


    【解决方案1】:

    取决于您在 Pi 上运行的发行版。如果您使用的是使用 systemd 的发行版,您可以运行 sudo systemctl enable --now udisks2.service 将服务配置为始终启动。

    您可能希望扩展代码以在 D-Bus 上查看 org.freedesktop.UDisks2 名称,因为您可能希望在信号消失和重新出现时重新连接它。 (我不知道 Qt D-Bus 是如何处理这个问题的;它是在信号处理程序注册时还是在信号发射时将众所周知的名称解析为唯一名称。)

    【讨论】:

    • 这是一个非常简单的解决方案,谢谢!我没有意识到 udisks2 是作为常规 systemd 服务文件编写的。然而,由于它是一个"static" 服务,所以systemctl enable 命令不像普通服务那样工作。所以,由于我自己的应用程序是作为 systemd 服务启动的,我可以让它依赖于 udisks2。
    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多