使用 Golang 启动 D-Bus 服务

Posted

技术标签:

【中文标题】使用 Golang 启动 D-Bus 服务【英文标题】:Starting D-Bus Service using Golang 【发布时间】:2018-04-29 11:07:04 【问题描述】:

我现在正在调用并使用 D-Bus API for golang 启动一个 systemd 服务(我只是调用一个 shell 脚本)。

我在 /usr/share/dbus-1/system-services/org.freedesktop.hello.service 中做了一个 D-Bus 服务

[D-BUS Service]
Name=org.freedesktop.hello
Exec=/bin/false
User=root
SystemdService=hello.service

和 /lib/systemd/system/hello.service 中的 systemd 服务

[Unit]
Description=Hello

[Service]
Type=dbus
BusName=org.freedesktop.hello
ExecStart=/opt/hello.sh

我正在尝试获得与下面代码相同的结果。

sudo gdbus call --system --dest org.freedesktop.hello --object-path /org/freedesktop/hello --method org.freedesktop.DBus.Introspectable.Introspect

但是我在 Golang 中不断收到错误,

The name org.freedesktop.hello was not provided by any .service files

我现在的代码是

package main

import (
    "encoding/json"
    "github.com/godbus/dbus"
    "os"
    "github.com/godbus/dbus/introspect"
)

func main() 
    conn, error1 := dbus.SessionBus()
    if error1 != nil 
        panic(error1)
    
    node, err2 := introspect.Call(conn.Object("org.freedesktop.hello", "/org/freedesktop/hello"))
    if err2 != nil 
        panic(err2)
    
    data, _ := json.MarshalIndent(node, "", "   ")
    os.Stdout.Write(data)

关于这些东西的信息不多,所以我想得到一些帮助。谢谢!

【问题讨论】:

错误消息似乎来自 systemd。添加 .service 文件后是否运行“systemctl daemon-reload”? 是的,我确实重新加载了守护进程,但仍然遇到同样的错误。 【参考方案1】:
sudo gdbus call --system ...

在系统总线上。

...
conn, error1 := dbus.SessionBus()
...

这是在会话总线上。

尝试使用 dbus.SystemBus() 之类的东西。

【讨论】:

你救了我的命!非常感谢!希望这可以帮助其他面临类似问题的人。

以上是关于使用 Golang 启动 D-Bus 服务的主要内容,如果未能解决你的问题,请参考以下文章

远程启动应用程序时在 Linux 上共享 D-BUS 消息总线

如何减少 golang tcp 服务器中的 cpu 使用率?

systemd 服务无法连接到会话 d-bus

Git + libsecret 抛出“没有 X11 $DISPLAY 无法自动启动 D-Bus”

GoWorld – 用Golang写一个分布式可扩展可热更的游戏服务器

docker容器中启动service服务 Failed to get D-Bus connection: Operation not permitted