Ben bash uygulanan ve aracılığıyla çalışan bir daemon var cron
ve @reboot
seç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 xprintidle
ve wmctrl
masaü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 crontab
hattı:
@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.
lightdm