Bagaimana cara mendeteksi dari skrip ketika desktop pengguna dimuat?

11

Saya memiliki daemon, diimplementasikan dalam bash dan berjalan dengan cara crondan @rebootopsi, 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, xprintidledan wmctrlgagal 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 grepgaris:

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 crontabbarisan:

 @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.

Peregring-lk
sumber
Manajer login apa yang Anda gunakan?
mtahmed
Manajer login saya adalahlightdm
Peregring-lk
Pertanyaan Pengguna Super ini mungkin bisa membantu Anda. Saya tidak yakin itu akan menjawab pertanyaan Anda sepenuhnya.
Rany Albeg Wein
1
Ini tidak terlalu kuat, tetapi Anda dapat memeriksa proses Gnome / KDE ...
jasonwryan
1
Anda harus mendokumentasikan apa yang Anda lakukan sebagai jawaban; mungkin membantu orang lain.
jasonwryan

Jawaban:

2

Coba gunakan D-Bus untuk menanyakan informasi sesi dari logindlayanan. Ini memiliki org.freedesktop.login1.Managerantarmuka dengan beberapa sinyal seperti SessionNewdan SeatNew. org.freedesktop.login1.Seatdan org.freedesktop.login1.Userantarmuka. Ini dapat membantu untuk mendapatkan status Sesi / Kursi / Pengguna.

gila
sumber
1

Gunakan skrip startup sesi login ~/.xprofileuntuk membuat beberapa file flag untuk Anda. Baik itu ~/.xlogin_flag, lalu dalam skrip Anda gunakan inotifywatchdari paket inotify-toolsuntuk melihatnya dibuat, disentuh atau dihapus.

Grzegorz Żur
sumber
1

Periksa output dari wperintah. Anda akan melihat tipe login (tampilan X) di bidang LOGIN @.

Grzegorz Żur
sumber
1

Saya pikir cara paling sederhana untuk memeriksa apakah pengguna terhubung di X11 adalah memeriksa proses yang menulis $HOME/.xsession-errorssejak ketika Anda login secara grafis, semua yang Anda stderr dialihkan ke sana.

Kalau tidak, gunakan saja wperintah, seperti yang sudah disarankan oleh @Grzegorz: jika FROMkolom dimulai dengan :maka itu adalah sesi grafis.

eppesuig
sumber
0

Periksa di direktori runtime lightdm. Pada Lengkungan dengan systemd dan lightdm, saat pengguna masuk, file xauthority akan dibuat.

$ 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

Anda bisa menguji ini dengan sesuatu seperti ini di loop sementara Anda.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
carlwgeorge
sumber