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
logind
D-Busを使用してサービスからセッション情報を照会します。などorg.freedesktop.login1.Manager
のさまざまな信号へのインターフェースがあります。そしてインターフェイス。セッション/座席/ユーザーのステータスを取得するのに役立ちます。SessionNew
SeatNew
org.freedesktop.login1.Seat
org.freedesktop.login1.User
答え2
ログイン・セッション開始スクリプトを使用して、~/.xprofile
いくつかのフラグ・ファイルを生成します。はい、次に~/.xlogin_flag
他のスクリプトからinotifywatch
from 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