Crontab内でいくつかのプログラムを実行する必要がありますが、プログラムはどうやってdbusセッションIDを知ることができますか?セッションマネージャーによって起動されたプログラムでのみ使用できます。
問題は Xディスプレイへのアクセス および X cookieファイルの場所を見つける に似ています。 (また、ユーザーのディスプレイでGUIプログラムを起動する場合は、これらの質問を参照してください。)
Dbusは、セッションアドレスを~/.dbus/session-bus
のファイルに保存します。ファイルの名前は$machine_id-$display_number
です。ここで、$machine_id
はランダムに生成された番号で、/var/lib/dbus/machine-id
に保存され、$display_number
はXディスプレイ番号です($DISPLAY
is :$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
に注意してください。
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 *ツールなどの他のプログラムを使用します。
乾杯。
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
はい、DBusにはxセッションが必要です。以前の回答と同様に、「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つの欠点は、ソフトウェアを停止した後、セッションがハングする可能性があることです。