Bir X penceresinin görünmesini / kaybolmasını bekleyin (akıllıca bir şekilde)


11

Bir kabuk betiğinin içinde, başlığında bir dize olan bir pencerenin görünmesini beklemem, bazı eylemler yapmam ve sonra kaybolmasını beklemem ve başka bir eylem yapmam gerekiyor.

Düne kadar bu basit kodu aldım. Buradaki sorun, komut dosyası çalışır durumdayken diskin güç tasarrufu durumuna alınamaması ve saatlerce sürebilmesidir:

while :; do
    until wmctrl -l | grep -q "$string"; do   # until
        sleep 0.5
    done
    : do action 1

    while wmctrl -l | grep -q "$string"; do   # while
        sleep 0.5
    done
    : do action 2
done

Bahsedilen kodun diski uyandırdığına karar verdiğim için, birkaç komut satırı aracının belgelerine geçtim xdotoolve pencerenin görünmesini beklemeye ve pencerenin xpropne zaman kaybolduğunu anlamaya karar verdim :

while :; do
    # we use `until' because sometimes xdotool just crashes
    until xdotool search -sync -all -onlyvisible -pid $pid -name "$string"; do
        :
    done

    # xdotool isn't trustworthy either, so check again
    wmctrl -l | grep -q "$string" ||
        continue

    : do action 1

    xprop -spy -root _NET_CLIENT_LIST_STACKING | while read line; do
        if [[ ! ${_line:-} || $_line = $line ]]; then
            _line=$line
            continue
        else
            _line=$line
            if wmctrl -l | grep -q "$string"; then
                continue
            else
                : do action 2
                break
            fi
        fi
    done
done

Şimdi yukarıdaki kod ile iki yeni sorun var:

  • xdotoolDaha önce geçici çözüm bulduğum gibi sadece çöküyor ve garip sonuçlar veriyor, aynı zamanda pencerenin görünmesini beklerken CPU'nun yaklaşık% 15'ini emiyor. Yani bu, diski uyandıran basit koddan kurtuldum, CPU'yu saatlerce boşa harcayan kod yazmak için ve niyetim ilk etapta güç tasarrufu yapmaktı.
  • xprop -spyodağı her değiştirdiğimde (geçici olarak çözdüğüm $_line) veya pencereleri oluşturup yok ettiğimde beni bilgilendirir . Bu, diski xdotool'den daha sık uyandırır.

Ben sadece başlık $stringgörünmesini veya kaybolması ile pencere için bekleyen basit bir program arıyorum . Mevcut bir komut satırı aracı, bir python betiği, derlenebilir C kodu olabilir ..., ama bir şekilde benim betime (sadece bir fifo için bazı bilgiler yazsa bile) entegre edebilmeliyim!


1
Eski kodunuzun diski neden uyandırdığını bulmak ve bir çözüm aramak mantıklı değil mi? Kroot ve ramdisk gibi bir şey. Sanırım strace -f -e trace=file wmctrl -lbilgilendirici olmalı.
Hauke ​​Laging

fatraceDisk uyanmalarını kontrol etmek için kullanıyorum ve bana bashokumaları /bin/sleepve /usr/bin/wmctrlher yarım saniyede bir, bu yüzden aslında pencere olaylarını bekleyecek bir program arıyorum. Bir şey mi kaçırıyorum?
Teresa e Junior

1
bunların okunması diski uyandırmaz çünkü saniyede iki kez çalıştırılırsa önbelleğe alınmaları muhtemeldir. Dosya sistemlerinizi noatime ile bağladınız mı? Ayrıca bkz btracegelen blktraceDisk etkinlik kaynaklarını araştırmak.
Stéphane Chazelas

1
Bunda bakmadıysanız henüz xwininfowmctrl daha kesinlikle yükleri çok daha az sayıda paylaşılan kütüphaneleri, kullanım olabilir ve daha yakın çıplak X bir seviyede çalışır
MSW

1
@msw Google Earth için otomatik kaydetme özelliği olan (kapalı kaynaklı ve hata bildirme zaman kaybıdır) düzeltilemez olanı düzeltmeye çalışıyorum
Teresa e Junior

Yanıtlar:


4

Bu size (Tamam: en çok ne unuttum? Yuva?) Dosya sistemi aktiviteleri yazar içermelidir:

strace -f command 2>&1 | 
  grep -e '^open.*O_CREAT' \
    -e ^write   \
    -e ^mkdir   \
    -e ^rmdir   \
    -e ^unlink  \
    -e ^rename  \
    -e ^chmod   \
    -e ^link    \
    -e ^symlink \
    -e ^mknod

Bu bilgi ile tmpfs'de çalışan bir kroot ortamı oluşturulabilir (son çare eylemi olarak; belki tmpfs için semboller yeterlidir). Program bir RAM krootunda başlatılırsa, diski doğrudan uyandırma şansı yoktur. Dosya sistemi hiyerarşisine hiçbir yazma diske yazılmaz.


Bir dosyayı okurken zamanlar olduğuna inanıyorum, en azından ilk kez, diski de uyandıracak, değil mi? Bunun blktraceiçin doğru araç olup olmayacağını merak ediyorum , ancak bir çekirdek derlemesi gerektirecektir # CONFIG_BLK_DEV_IO_TRACE is not set:( Bu, bu sorunun kapsamı dışında olsa da. Teşekkür ederim!
Teresa e Junior

1
@TeresaeJunior Tabii ama bu sorunu kim düşünebilir? Bu, komut dosyasını her zaman çalışmaya devam ettirmekle ilgili değildir. Ve boot.local/ den tmpfs oluşturabilirsiniz, rc.localböylece betiği daha sonra başlatsanız bile disk erişiminiz olmaz. Sadece bir göz attım blktrace(daha önce bilmiyordum). Bu çok korkunç, bu gece uyuyacağım mı merak ediyorum ...
Hauke ​​Laging

Evet, bundan gerçekten endişelenmemeliyim, yine haklısın. Ama sadece bu özel Google Earth kesmek değil, diski sürekli olarak uyandırabilecek her şeyi kontrol etmek istediğim için çekirdeği derleyerek bu uyku gecesini de kaybedeceğimi düşünüyorum :)
Teresa e Junior

6

Bir "gerçek" X11 uygulaması yazarak bunu yönetmek için pencere yöneticinize veya X11'e güvenmek daha basit ve daha güvenilir olabilir.

Kabuktan istediğiniz şey, pencere yöneticisine kaydolan ve kabuğa dönmeden önce istenen bir olay türünü bekleyen bir şeydir ... Kabuğun içinde döngüden kaçınabiliyorsanız çok daha fazla yük dostu olur. ( until xdotool...Döngünün içinde gecikme (uyku) olmadığı için nedenleriniz yüklenir.)

Ah ... görünüşe göre xdotoolbu özellik bir yıl önce eklenmişti --sync. Şu anki Linux dağıtımımda (Debian Squeeze) mevcut değil, bu yüzden denemedim.

Sizinkine benzer bir soruyu cevaplayan xdotool geliştiricisi: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ


Evet, tam olarak, -syncistediğimi yapmalıydım, ama whilepencere görünmeden önce sonunda çökecek ve çok fazla CPU harcayacağı için buna ihtiyaç duyuyor . Aslında xdotoolkaynağından derledim çünkü Debian'dan yazmak inanılmaz derecede yavaştı. X ile doğrudan etkileşime giren bir uygulama yazmak aslında benden öte. Yine de teşekkürler!
Teresa e Junior
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.