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


17

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

Answers:


21

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

Dbus将会话地址存储在中的文件中~/.dbus/session-bus。文件的名称是$machine_id-$display_number,其中$machine_id是存储在其中的随机生成的数字,/var/lib/dbus/machine-id并且$display_number是X显示数字($DISPLAYis :$display_number:$display_number.$screen_number)。在该文件~/.dbus/session-bus是可分析由一个外壳和包含定义为DBUS_SESSION_BUS_ADDRESSDBUS_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

我认为,如果您知道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与其他程序(如notify-send或dbus *工具)一起使用。

干杯。


非常令人印象深刻,实际上我正在运行KDE4,所以我寻找了plasma-desktop,谢谢!
雏菊2012年

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

1

我无法评论Vincenzo的答案,但是我发现他的答案最适合KDE4。

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

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

ADDRESS大写字母注意。


0

是的,DBus必须进行斧会话。像之前的答案一样,“ 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> 

该解决方案的一个挫折是,在您停止软件后,会话可能会中断。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.