私は、Gnome セッションがユーザーによって「ロック」されているかどうか、またいつロックされているかを検出して、そのユーザーをキックし、公共のラボで画面がロックされるのを防ぐスクリプトを作成中です。ただし、これを行う唯一の方法は、次のように dbus-monitor を起動することのようです。
dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
残念ながら、いくら試しても、これをルートとして動作させることができません。次のことを試しました:
1
eval `dbus-launch`
dbus-monitor --session ...
同じエラーで起動に失敗する
2
export $(dbus-launch)
dbus-monitor --session ...
これは起動しますが、メッセージを正常に監視できません。
3
eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...
これは起動しますが、メッセージは監視しません
X11 セッション エラーが発生した場合の正確なエラーは次のとおりです。
Failed to open connection to session message bus: dbus-launch failed to autolaunch D-Bus session: Fd 4 did not have the close-on-exec flag set! Setting the flag.
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified
Autolaunch error: X11 initialization failed.
つまり、セッション org.gnome.ScreenSaver dbus メッセージをリモートで監視できる必要があります (新しいユーザーを設定するのは面倒なので、理想的には root として)。その方法がわかりません。また、ユーザーとしてログインしている場合は、dbus-monitor コマンドを単独で問題なく実行できることも付け加えておきます (期待どおりにログが記録されます)。
害にはならないので、さらに情報を提供します。
カーネル: RHEL5
2.6.18-406.el5
DBUS バージョン:
D-Bus Message Bus Launcher 1.1.2
GNOME バージョン:
2.16.0
答え1
問題は、dbus-monitor が別のユーザー/セッション (root) として実行されているため、接続先がわからないことです。次のようにして、環境から DBUS ADDRESS を取得できます。
DBUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s gnome-session)/environ)
dbus-monitor --address "$DBUS_ADDRESS" "type=signal,interface=org.gnome.ScreenSaver"
これらのコマンドは、 で実行中のプロセスを見つけようpidof -s gnome-session
とし、環境を調べて DBUS_SESSION_BUS_ADDRESS を grep し、それを DBUS_ADDRESS に割り当て、変数を使用して dbus-monitor に監視するメッセージ バスを指示します。
複数のセッションがある場合は、「最初の」セッションでのみ機能することに注意してください。