我有一个进程(dbus-daemon),它通过 UNIX 套接字有许多打开的连接。这些连接之一是 fd #36:
=$ ps uw -p 23284
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
depesz 23284 0.0 0.0 24680 1772 ? Ss 15:25 0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
=$ ls -l /proc/23284/fd/36
lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410]
=$ netstat -nxp | grep 1013410
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 X11 转发和 SSH 运行各种 Gnome 应用程序。某些应用程序会导致首先生成“dbus-launch”应用程序。问题是当退出 X 应用程序时 dbus-launch 不会关闭,因此必须在 SSH 会话可以正确关闭之前终止。
我认为问题是 X/Gnome 应用程序无法与主消息总线守护进程连接,因此必须启动它们自己的副本?我怎样才能解决这个问题?或者我错过了什么?
这是一个例子。我启用了 X11 转发,似乎一切正常。
[me@host ~]$ gnome-calculator &
[1] 4803
Run Code Online (Sandbox Code Playgroud)
(这里 gcalctool 程序启动并显示到我的删除 X 服务器(Xming))
[me@host ~]$ ps
PID TTY TIME CMD
4706 pts/0 00:00:00 bash
4803 pts/0 00:00:00 gnome-calculator
4807 pts/0 00:00:00 dbus-launch
4870 pts/0 00:00:00 ps
Run Code Online (Sandbox Code Playgroud)
(现在,在远程会话中关闭 gcalctool 应用程序后)
[me@host ~]$ ps
PID TTY TIME CMD
4706 pts/0 00:00:00 bash
4807 pts/0 00:00:00 dbus-launch
4898 pts/0 00:00:00 ps
Run Code Online (Sandbox Code Playgroud)
请注意, dbus-launch 仍处于活动状态。最糟糕的是,这会阻止 SSH 连接正确关闭,直到它被终止。 …
我需要帮助在无头 Linux 系统上启动通过会话(不是系统)D-Bus 进行通信的服务。关键是没有人会登录无头系统。
到目前为止,我已经能够在三个不同的终端中代表未登录的用户(“其他用户”)启动 D-Bus 守护程序并测试 D-Bus 通信:
在第一个终端中,我为“otheruser”启动了一个 D-Bus 守护进程:
$ sudo -u otheruser dbus-daemon --session --print-address 1
unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48
Run Code Online (Sandbox Code Playgroud)
在第二个终端中,我使用上述 DBUS_SESSION_BUS_ADDRESS 响应启动 D-Bus 服务器应用程序:
$ sudo -u otheruser DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48" /usr/bin/my-dbus-service
Run Code Online (Sandbox Code Playgroud)
然后,在第三个终端中,我可以测试连接:
$ sudo -u otheruser DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48" gdbus introspect --session --dest com.mycompany.myappname --object-path /com/mycompany/interface
Run Code Online (Sandbox Code Playgroud)
但是,我想通过 systemd 启动 D-Bus 服务器应用程序以及一些客户端 D-Bus 服务。如何通过 systemd 启动 D-Bus 会话,以便将其 DBUS_SESSION_BUS_ADDRESS 环境变量传播到“otheruser”的 D-Bus 服务器和客户端服务?
一种可能的解决方案可能是将 dbus-daemon 的输出通过管道传输到“somefile”,然后在启动 D-Bus 服务器和客户端之前设置 DBUS_SESSION_BUS_ADDRESS=$(cat somefile)。这对我来说似乎有点太尴尬了;特别是因为我知道系统D-Bus 连接的 systemd 服务文件中的“Busname”指令有一些神奇之处。如何为“其他用户”正确启动 systemd 服务,以便这些 systemd 服务可以与会话 D-Bus 接口进行通信?
我正在尝试使用类似问题的答案来设置用户级服务。我已经创建了所需的文件并重新启动。
我正在取得进展,因为我现在收到“无法获得 D 总线连接:权限被拒绝”,而“无法获得 D 总线连接:连接被拒绝”,但我很困惑,因为我不知道是什么对象它正在尝试访问(文件?套接字?),因此甚至无法检查当前权限。有任何想法吗?
到目前为止,我已经添加了:
loginctl enable-linger userservice
Run Code Online (Sandbox Code Playgroud)
[Unit]
Description=D-Bus User Message Bus
Requires=dbus.socket
[Service]
ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig
[Install]
Also=dbus.socket
Run Code Online (Sandbox Code Playgroud)
[Unit]
Description=D-Bus User Message Bus Socket
[Socket]
ListenStream=%t/bus
ExecStartPost=-/bin/systemctl --user set-environment DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus
[Install]
WantedBy=sockets.target
Also=dbus.service
Run Code Online (Sandbox Code Playgroud)
[Unit]
Description=Test user-level service
[Service]
Type=dbus
BusName=com.wtf.service
ExecStart=/home/userservice/userservice.py
Restart=on-failure
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
没有在别处添加任何链接...
让它失败:
systemctl --user status
Run Code Online (Sandbox Code Playgroud)
编辑 2018-10-25:
添加export XDG_RUNTIME_DIR=/run/user/$(id -u) …
描述:
我想从另一台机器访问 D-Bus 系统服务,只知道机器的 IP 地址和要连接的服务。
我最近发现的是Gabriel(通过 SSH 的 D-Bus)。我已经编译了它的 GIT 版本(托管在 Sourceforge 上),这似乎有效,但我一直遇到缺乏“保持活动”的问题。这意味着在一段时间不活动后,SSH 隧道无法将 D-Bus 请求转发到远程 PC,我必须重新启动 Gabriel。
由于 Gabriel 在它连接的 PC 上使用 socat,我刚刚有了在本地 PC 上也使用 socat 的想法(用它代替 Gabriel)。
问题:
任何意见表示赞赏。
我有这个 Fedora VM,由于某种原因,一段时间后总是开始进行非常缓慢的“sudo”身份验证(或一般的身份验证,例如 GUI 应用程序要求凭据)。它会正常工作,直到某个时刻 (*) 它开始等待 20 秒以上,然后才会显示密码提示。
(*) 那一刻可能是在我暂停并重新启动 VM 之后,但我无法可靠地重现这一点。
我想我将它追溯到与 DBus 有关的事情,因为执行 sudo 的“跟踪”给了我这个:
0.000040 connect(8, {sa_family=AF_LOCAL, sun_path="/var/run/dbus/system_bus_socket"}, 33) = 0
0.000095 fcntl(8, F_GETFL) = 0x2 (flags O_RDWR)
0.000035 fcntl(8, F_SETFL, O_RDWR|O_NONBLOCK) = 0
0.000039 geteuid() = 0
0.000038 getsockname(8, {sa_family=AF_LOCAL, NULL}, [2]) = 0
0.000060 poll([{fd=8, events=POLLOUT}], 1, 0) = 1 ([{fd=8, revents=POLLOUT}])
0.000041 sendto(8, "\0", 1, MSG_NOSIGNAL, NULL, 0) = 1
0.000090 sendto(8, "AUTH EXTERNAL 30\r\n", 18, MSG_NOSIGNAL, NULL, 0) = 18
0.000135 poll([{fd=8, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个脚本,该脚本将检测 Gnome 会话是否以及何时被用户“锁定”,以踢出该用户并防止人们在公共使用实验室中锁定屏幕。但是,似乎唯一的方法是启动一个 dbus-monitor,如下所示:
dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
Run Code Online (Sandbox Code Playgroud)
不幸的是,无论我尝试了多少事情,我都无法以 root 身份运行它。我尝试了以下方法:
eval `dbus-launch`
dbus-monitor --session ...
Run Code Online (Sandbox Code Playgroud)
这无法启动并出现相同的错误
export $(dbus-launch)
dbus-monitor --session ...
Run Code Online (Sandbox Code Playgroud)
这将启动但未成功监视消息。
eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...
Run Code Online (Sandbox Code Playgroud)
这会启动但不监视消息
当我得到 X11 会话错误时的确切错误如下:
Failed to open connection to session message bus: dbus-launch failed to autolaunch D-Bus session: Fd 4 did not have the close-on-exec flag set! Setting the flag.
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified
Autolaunch error: X11 initialization failed.
Run Code Online (Sandbox Code Playgroud)
很简单,我需要能够远程监控会话 …