私は、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を定義するだけで十分です。
lightdm