回答:
問題は、と少し似ているXディスプレイにアクセスすると、Xクッキーファイルの場所を見つけます。(また、ユーザーのディスプレイで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
シェルによって解析可能であるとの定義が含まれています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としてグラフィカルプログラムを起動できますか?を参照してください。
Vincenzoの答えについてコメントすることはできませんが、KDE4で彼の答えが私にとって最もうまくいくと思います。
ただし、コマンドを少し変更する必要がありました。私にとっては:
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
ADDRESS
大文字で注意してください。
はい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>
このソリューションの欠点の1つは、ソフトウェアを停止した後にセッションがハングアップする可能性があることです。
plasma-desktop
代わりに探しました、ありがとう!