Saya memiliki daemon, diimplementasikan dalam bash dan berjalan dengan cara cron
dan @reboot
opsi, yang menunjukkan desktop tidak aktif. Scriptnya sebagai berikut (timingnya singkat untuk tujuan pengujian):
#!/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
Masalah: Jika pengguna masih, misalnya, di layar masuk, xprintidle
dan wmctrl
gagal karena desktop belum dimuat. Untuk menghindari ini, saya telah meletakkan baris berikutnya di bagian paling awal dari skrip:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
Jadi, skrip menunggu pengguna (variabel USER diatur ke nama pengguna saya di file crontab) dicatat. Tetapi, jika pengguna memulai, misalnya, sesi terminal (dan bukan sesi grafis seperti KDE atau GNOME), skrip juga melanjutkan.
Bagaimana saya bisa menentukan apakah pengguna sudah dalam sesi "grafis" yang mampu "menunjukkan mode desktop" atau tidak? Dan lagi pula, bagaimana saya bisa memastikan bahwa sesi "grafis" sudah dimuat penuh dan tidak dalam proses memuat atau semacamnya?
Solusi saya: Solusi
(informal) saya menambahkan di loop utama grep
garis:
WAIT_TIME=180
while:
do
sleep $WAIT_TIME
[ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue
## My actions here
done
Menjadi "$ WM_CMD" perintah target windows manager . Saya berasumsi bahwa, jika perintah windows manager sedang berjalan di sistem, itu berarti desktop sudah sepenuhnya dimuat dan semua perintah "grafik" pasti.
Di mana variabel WM_CMD didefinisikan? Dalam crontab
barisan:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
Tetapi saya juga berpikir bahwa akan mungkin untuk mendeteksi "perintah windows manager" melalui permintaan sistem lainnya. Namun, bagi saya mendefinisikan WM_CMD dalam file crontab sudah cukup.
lightdm