crontabでいくつかのプログラムを実行する必要がありますが、プログラムはdbusセッションIDをどのように知っていますか?セッションマネージャが起動したプログラムでのみ機能します。
答え1
問題はやや似ています。VisitXShowそしてX Cookieファイルの場所を見つける。 (また、ユーザーのモニターでGUIプログラムを実行したい場合は、この質問を参照してください。)
Dbusはセッションアドレスをに保存します~/.dbus/session-bus
。ファイル名は、$machine_id-$display_number
に$machine_id
保存されているランダムに生成された数字、X表示番号(または)/var/lib/dbus/machine-id
です。のファイルはシェルから解析することができ、 との定義を含みます。$display_number
$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としてグラフィカルプログラムを起動できますか?
答え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-)"
次に、通知の送信やdbus *ツールなどの他のプログラムでSESSION IDを使用してください。
乾杯。
答え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>
このソリューションの1つの欠点は、ソフトウェアを停止した後にセッションが中断される可能性があることです。