
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
logind
D-Bus を使用して、サービスからセッション情報を照会してみてください。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