Kullanıcının masaüstünü yüklediğinde komut dosyasından nasıl tespit edilir?


11

Ben bash uygulanan ve aracılığıyla çalışan bir daemon var cronve @rebootseçeneği, masaüstü hareketsiz gösterir. Komut dosyası aşağıdaki gibidir (zamanlamalar test amacıyla kısadır):

#!/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

Sorun: Bir kullanıcı giriş ekranında, örneğin, hala, varsa xprintidleve wmctrlmasaüstü henüz yüklü olmadığı için başarısız olur. Bundan kaçınmak için, komut satırının en başına sonraki satırları koydum:

while:
do
    sleep 10s
    [ -n `who | grep "$USER"` ] && break
done

Bu nedenle, komut dosyası kullanıcıyı bekler (USER değişkeni crontab dosyasındaki kullanıcı adım olarak ayarlanır) günlüğe kaydedilir. Ancak, bir kullanıcı, örneğin bir terminal oturumu başlatır (KDE veya GNOME gibi bir grafik oturumu değil), komut dosyası da devam eder.

Bir kullanıcının zaten "masaüstü modunu gösterme" yeteneğine sahip bir "grafik" oturumda olup olmadığını nasıl belirleyebilirim? Dahası, bir "grafik" oturumun tamamen yüklenmesini ve yüklenme sürecinde veya bunun gibi bir şey olmamasını nasıl sağlayabilirim?

Benim çözümüm: Benim (gayri resmi) çözümüm ana döngüye grepçizgi ekliyor :

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue

    ## My actions here
done

Hedef windows manager komutu "$ WM_CMD" olmak . Eğer, farz pencere yöneticisi komut sistemiyle çalışan, masaüstü tamamen yüklenmiş demektir ve herhangi bir "grafik" komutu emin.

WM_CMD değişkeni nerede tanımlanır? In crontabhattı:

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

Ama aynı zamanda diğer sistem istekleri aracılığıyla "windows manager komutu" tespit etmek mümkün olacağını düşünüyorum. Ancak, benim için crontab dosyasında WM_CMD tanımlamak yeterlidir.


Hangi giriş yöneticisini kullanıyorsunuz?
mtahmed

Benim giriş menajerilightdm
Peregring-lk

Bu Süper Kullanıcı sorusu size yardımcı olabilir. Sorunuza tamamen cevap vereceğinden emin değilim.
Rany Albeg Wein

1
Özellikle sağlam değil, ama Gnome / KDE sürecini kontrol edebilirsiniz ...
jasonwryan

1
Cevap olarak ne yaptığınızı belgelemelisiniz; başkalarına yardımcı olabilir.
jasonwryan

Yanıtlar:


2

logindHizmetten oturum bilgilerini sorgulamak için D-Bus'u kullanmayı deneyin . It has org.freedesktop.login1.Managerbirçok gibi sinyal ile arayüzü SessionNewve SeatNew. org.freedesktop.login1.Seatve org.freedesktop.login1.Userarayüzler. Oturum / Koltuk / Kullanıcı durumunu almanıza yardımcı olabilir.


1

~/.xprofileSizin için bazı bayrak dosyaları oluşturmak için oturum açma başlangıç ​​komut dosyasını kullanın. Olun ~/.xlogin_flag, sonra diğer komut dosyasında , oluşturulduğunu, dokunduğunu veya silindiğini görmek için inotifywatchpaketten inotify-toolskullanın.


1

wKomut çıkışını kontrol edin . LOGIN @ alanında oturum açma türünü (X ekran) göreceksiniz.


1

Bir kullanıcının X11'de bağlı olup olmadığını kontrol etmenin en basit yolunun, $HOME/.xsession-errorsgrafik olarak giriş yaptığınızda, tüm stderr oraya yönlendirildiği için yazılan işlemleri kontrol etmektir.

Aksi takdirde w, @Grzegorz tarafından önerildiği gibi komutu kullanın : FROMsütun başlıyorsa :grafiksel bir oturumdur.


0

Lightdm'nin çalışma zamanı dizinini kontrol edin. Systemd ve lightdm içeren Arch üzerinde, bir kullanıcı oturum açtığında bir xauthority dosyası oluşturulur.

$ 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

Bunu while döngünüzde böyle bir şeyle test edebilirsiniz.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.