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
Jawaban:
Coba gunakan D-Bus untuk menanyakan informasi sesi dari
logind
layanan. Ini memilikiorg.freedesktop.login1.Manager
antarmuka dengan beberapa sinyal sepertiSessionNew
danSeatNew
.org.freedesktop.login1.Seat
danorg.freedesktop.login1.User
antarmuka. Ini dapat membantu untuk mendapatkan status Sesi / Kursi / Pengguna.sumber
Gunakan skrip startup sesi login
~/.xprofile
untuk membuat beberapa file flag untuk Anda. Baik itu~/.xlogin_flag
, lalu dalam skrip Anda gunakaninotifywatch
dari paketinotify-tools
untuk melihatnya dibuat, disentuh atau dihapus.sumber
Periksa output dari
w
perintah. Anda akan melihat tipe login (tampilan X) di bidang LOGIN @.sumber
Saya pikir cara paling sederhana untuk memeriksa apakah pengguna terhubung di X11 adalah memeriksa proses yang menulis
$HOME/.xsession-errors
sejak ketika Anda login secara grafis, semua yang Anda stderr dialihkan ke sana.Kalau tidak, gunakan saja
w
perintah, seperti yang sudah disarankan oleh @Grzegorz: jikaFROM
kolom dimulai dengan:
maka itu adalah sesi grafis.sumber
Periksa di direktori runtime lightdm. Pada Lengkungan dengan systemd dan lightdm, saat pengguna masuk, file xauthority akan dibuat.
Anda bisa menguji ini dengan sesuatu seperti ini di loop sementara Anda.
sumber