ユーザーのデスクトップが読み込まれたときにスクリプトから検出するにはどうすればよいですか?

ユーザーのデスクトップが読み込まれたときにスクリプトから検出するにはどうすればよいですか?

cron私は、bash で実装され、オプションを使用して実行され、非アクティブなデスクトップを表示するデーモンを持っています@reboot。スクリプトは次のとおりです (テスト目的のため、時間は短くなっています)。

#!/bin/bash
P_STATE=0
while :
do
    sleep 5
    if [ $P_STATE == 0 ]; then
         [ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on
    else
         [ `xprintidle` -le 25000 ] && P_STATE=0
done

問題: たとえば、ユーザーがまだログイン画面にいる場合、xprintidleデスクトップwmctrlがまだ読み込まれていないために失敗します。これを回避するには、スクリプトの先頭に次の行を追加します。

while:
do
    sleep 10s
    [ -n `who | grep "$USER"` ] && break
done

したがって、スクリプトはユーザー (crontab ファイルで USER 変数がユーザー名に設定されている) がログインするまで待機します。ただし、ユーザーが、たとえばターミナル セッション (KDE や GNOME などのグラフィカル セッションではない) を開始すると、スクリプトも続行されます。

ユーザーがすでに「デスクトップ モードを表示」できる「グラフィカル」セッションにいるかどうかをどのように判断できますか? さらに、「グラフィカル」セッションが完全に読み込まれていて、読み込み中などではないことをどのように確認できますか?

私の解決策: 私の(非公式の)解決策は、メイン ループに次の行を追加することですgrep

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue

    ## My actions here
done

ターゲットは「$WM_CMD」Windows マネージャー コマンド. もし、Windows マネージャー コマンドシステムで実行されている場合、デスクトップが完全に読み込まれ、すべての「グラフィック」コマンドが確実に実行されることを意味します。

WM_CMD 変数はどこで定義されていますか? 次のcrontab行にあります:

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

しかし、他のシステム要求によって「Windows マネージャー コマンド」を検出することも可能だと思います。ただし、私にとっては、crontab ファイルで WM_CMD を定義するだけで十分です。

答え1

logindD-Bus を使用して、サービスからセッション情報を照会してみてください。D-Bus には、やorg.freedesktop.login1.Managerなどのいくつかの信号とのインターフェイスがあります。およびインターフェイス。セッション/シート/ユーザーの状態を取得するのに役立ちます。SessionNewSeatNeworg.freedesktop.login1.Seatorg.freedesktop.login1.User

答え2

ログイン セッションの起動スクリプトを使用して~/.xprofile、フラグ ファイルをいくつか作成します。~/.xlogin_flagその後、他のスクリプトでinotifywatchfrom package を使用してinotify-tools、作成、変更、または削除されているかどうかを確認します。

答え3

コマンドの出力を確認しますw。LOGIN@ フィールドにログイン タイプ (X ディスプレイ) が表示されます。

答え4

lightdm のランタイム ディレクトリを確認します。systemd と lightdm を備えた Arch では、ユーザーがログインすると xauthority ファイルが作成されます。

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

while ループで次のようなものを使用してこれをテストできます。

[[ -f /run/lightdm/${USER}/xauthority ]] && continue

関連情報