ユーザーのデスクトップがスクリプトから読み込まれるタイミングをどのように検出しますか?

ユーザーのデスクトップがスクリプトから読み込まれるタイミングをどのように検出しますか?

bashに実装されたデーモンがあり、非アクティブなデスクトップを表示し、cronオプションを使用して実行します。@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

したがって、スクリプトは、ユーザー(USER変数はcrontabファイルに自分のユーザー名に設定されている)が書き込まれるのを待ちます。ただし、ユーザーがターミナルセッション(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」の対象になりましょうウィンドウマネージャコマンド。私はウィンドウマネージャコマンドこれは、デスクトップが完全にロードされ、すべての「グラフィックス」コマンドが正常であることを意味します。

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を使用してサービスからセッション情報を照会します。など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

関連情報