ユーザーのデスクトップが読み込まれたときにスクリプトから検出する方法は?


11

私は、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」であることは、ターゲットのWindowsマネージャーコマンドです。場合、私は、それを前提とウィンドウマネージャコマンドは、システムで実行されている、それはデスクトップが完全にロードされていることと、任意の「グラフィック」コマンドは確かです。

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

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

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


どのログインマネージャを使用していますか?
mtahmed 2013

私のログインマネージャーはlightdm
Peregring-lk 2013

このスーパーユーザーの質問はあなたに役立つかもしれません。それでもあなたの質問に完全に答えられるとは思いません。
Rany Albeg Wein

1
特に堅牢ではありませんが、Gnome / KDEプロセスを確認できます...
jasonwryan

1
何をしたかを回答として文書化する必要があります。他の人を助けるかもしれません。
jasonwryan 2013

回答:


2

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


1

ログインセッション起動スクリプト~/.xprofileを使用して、フラグファイルを作成します。それ~/.xlogin_flagである場合は、他のスクリプトinotifywatchでパッケージinotify-toolsから使用して、作成、変更、削除されていることを確認してください。


1

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


1

ユーザーがX11で接続されているかどうかを確認する最も簡単な方法は、$HOME/.xsession-errorsグラフィカルにログインするとすべてのstderrがそこにリダイレクトされるため、書き込みを行うプロセスを確認することです。

それ以外の場合だけ使用しw、すでに@Grzegorzにより示唆されるように、コマンドを次の場合FROM、列で始まる:、それはグラフィカルなセッションです。


0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.