在 crontab 中运行 dbus 程序,如何知道 SESSION id?

在 crontab 中运行 dbus 程序,如何知道 SESSION id?

我需要在 crontab 中运行一些程序,但是程序如何知道 dbus 会话 id ?它仅适用于会话管理器启动的程序。

答案1

问题有点类似于访问 X 显示查找 X cookie 文件的位置。 (此外,如果您想在用户显示器上启动 GUI 程序,请参阅这些问题。)

Dbus 将会话地址存储在~/.dbus/session-bus.文件的名称是$machine_id-$display_number,其中$machine_id是存储在中的随机生成的数字/var/lib/dbus/machine-id$display_number是 X 显示数字($DISPLAY:$display_number:$display_number.$screen_number)。中的文件~/.dbus/session-bus可由 shell 解析,并包含DBUS_SESSION_BUS_ADDRESS和 的定义DBUS_SESSION_BUS_PID

dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
if [ -e "$dbus_session_file" ]; then
  . "$dbus_session_file"
  export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
  dbus-send …
fi

请注意,不能保证 dbus 守护进程仍然可用。用户可能已注销。

另一种方法是在桌面会话中查找进程的 PID,并从其环境中获取 dbus 地址。

export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')

如果 crontab 以 root 身份运行,并且您想要与登录到控制台的任何用户的会话进行通信,请参阅我可以以 root 身份在另一个用户的桌面上启动图形程序吗?

答案2

我无法评论文森佐的回答,但我发现他的答案在 KDE4 上最适合我。

不过我不得不稍微修改一下命令。对我来说是:

ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

通知ADDRESS用大写字母。

答案3

我认为如果您知道 gnome 会话管理器的 pid,那么您可以从/proc文件系统读取环境。

GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"

然后将 SESSION id 与其他程序(如通知发送或 dbus* 工具)一起使用。

干杯。

答案4

是的,DBus 必须有 ax 会话。与之前的答案一样,“DBUS_SESSION_BUS_ADDRESS”在启动之前必须有一个值。但是,您可以使用“dbus-launch”来创建此值。以下代码片段可以放入从 crontab 调用的脚本中。

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
  eval `dbus-launch --sh-syntax`
fi
echo "D-Bus daemon address is:"
echo "$DBUS_SESSION_BUS_ADDRESS"

# -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
sudo -u <user> -E <program> 

此解决方案的一个缺点是,在您停止软件后,会话可能会挂起。

相关内容