web-dev-qa-db-ja.com

crontabでdbusプログラムを実行します。SESSIONIDを知る方法は?

Crontab内でいくつかのプログラムを実行する必要がありますが、プログラムはどうやってdbusセッションIDを知ることができますか?セッションマネージャーによって起動されたプログラムでのみ使用できます。

17
daisy

問題は 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に注意してください。

3
noric

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 *ツールなどの他のプログラムを使用します。

乾杯。

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

はい、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つの欠点は、ソフトウェアを停止した後、セッションがハングする可能性があることです。

0
karnbo