私は、Gnomeセッションがユーザーによって「ロック」されているかどうか、いつユーザーが「ロック」されているかを検出して、パブリックラボでの画面のロックを防止するスクリプトに取り組んでいます。ただし、これを行う唯一の方法は、次のようにdbus-monitorを起動することです。
dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
残念ながら、いくつ試しても、これをrootとして機能させることはできません。私は以下を試しました:
eval `dbus-launch`
dbus-monitor --session ...
これは同じエラーで起動に失敗します
export $(dbus-launch)
dbus-monitor --session ...
これは起動しますが、メッセージを正常に監視していません。
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
問題は、dbus-monitorが別のユーザー/セッション(root)として実行されているため、どこに接続するかを認識していないことです。次のような方法で環境からDBUSアドレスを取得できます。
DBUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s gnome-session)/environ)
dbus-monitor --session --address "$DBUS_ADDRESS" "type=signal,interface=org.gnome.ScreenSaver"
これらのコマンドは、pidof -s gnome-session
を使用して実行中のプロセスを見つけようとします。次に、環境を調べてDBUS_SESSION_BUS_ADDRESSをgrepし、それをDBUS_ADDRESSに割り当て、変数を使用して、監視するメッセージバスをdbus-monitorに通知します。
複数のセッションがある場合、「最初の」でのみ機能することに注意してください。