Tunggu jendela X muncul / menghilang (dengan cara yang waras)

11

Di dalam skrip shell, saya harus menunggu jendela yang memiliki string pada judulnya muncul, melakukan beberapa tindakan, dan kemudian menunggu itu menghilang, dan melakukan beberapa tindakan lainnya.

Sampai kemarin, saya punya kode sederhana ini. Masalahnya adalah bahwa disk tidak dapat diletakkan dalam keadaan hemat daya saat skrip dibiarkan berjalan, dan bisa berjam-jam:

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

Karena saya memutuskan kode yang disebutkan itu adalah membangunkan disk, saya pergi melalui dokumentasi beberapa alat baris perintah, dan memutuskan xdotooluntuk menunggu jendela muncul, dan xpropuntuk mencari tahu kapan jendela telah hilang:

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

Sekarang saya memiliki dua masalah baru dengan kode di atas:

  • xdotooltidak hanya crash dan memberikan hasil yang aneh, seperti yang saya lakukan sebelumnya, tetapi juga menyedot sekitar 15% dari CPU sambil menunggu jendela muncul. Jadi itu berarti saya menyingkirkan kode sederhana yang membangunkan disk, untuk menulis kode yang diboroskan CPU selama berjam-jam, dan niat saya adalah menghemat daya di tempat pertama.
  • xprop -spyakan memberi tahu saya setiap kali saya mengubah fokus (yang telah saya selesaikan $_line) atau membuat dan menghancurkan jendela. Itu membangunkan disk lebih sering daripada xdotool.

Saya mencari program sederhana yang hanya menunggu jendela dengan judul $stringmuncul atau menghilang. Ini bisa menjadi alat baris perintah yang ada, skrip python, kode C yang dapat dikompilasi ..., tapi saya harus dapat mengintegrasikannya entah bagaimana ke skrip saya (bahkan jika itu hanya menulis beberapa informasi ke fifo)!

Teresa e Junior
sumber
1
Tidakkah masuk akal untuk mencari tahu mengapa kode lama Anda membangunkan disk dan mencari solusi? Sesuatu seperti chroot dan ramdisk. Saya kira strace -f -e trace=file wmctrl -lharus informatif.
Hauke ​​Laging
Saya menggunakan fatraceuntuk memeriksa bangun disk, dan itu memberitahu saya bashmembaca /bin/sleepdan /usr/bin/wmctrlsetiap setengah detik, itu sebabnya saya mencari beberapa program yang benar-benar akan menunggu acara jendela. Apakah saya melewatkan sesuatu?
Teresa e Junior
1
membaca itu tidak akan membangunkan disk karena mereka kemungkinan akan di-cache jika dijalankan dua kali setiap detik. Apakah Anda memasang sistem file Anda dengan noatime? Lihat juga btracedari blktraceuntuk menyelidiki sumber aktivitas disk.
Stéphane Chazelas
1
Jika Anda belum melihatnya xwininfomungkin masih bisa digunakan, itu tentu memuat jauh lebih sedikit perpustakaan bersama daripada wmctrl dan beroperasi pada tingkat yang lebih dekat ke bare X.
msw
1
@msw Saya mencoba memperbaiki yang tidak dapat diperbaiki, yang merupakan fitur penyimpanan otomatis untuk Google Earth (bersumber tertutup dan melaporkan bug adalah buang-buang waktu)
Teresa e Junior

Jawaban:

4

Ini harus memberi Anda semua (OK: kebanyakan. Apa yang saya lupa? Soket?) Kegiatan sistem file yang meliputi menulis:

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

Dengan informasi ini, lingkungan chroot yang berfungsi dapat dibuat dalam tmpfs (sebagai tindakan terakhir; mungkin symlink ke tmpfs sudah cukup). Jika program dimulai dalam chroot RAM maka tidak memiliki kesempatan untuk membangunkan disk secara langsung. Tidak ada tulisan untuk hierarki sistem file yang pernah ditulis ke disk.

Hauke ​​Laging
sumber
Saya percaya ada saat-saat ketika membaca file, setidaknya untuk pertama kalinya, akan membangunkan disk juga, bukan? Saya bertanya-tanya apakah blktraceakan menjadi alat yang tepat untuk itu, tetapi akan membutuhkan kompilasi kernel # CONFIG_BLK_DEV_IO_TRACE is not set:( Namun, itu berada di luar cakupan pertanyaan ini. Terima kasih!
Teresa e Junior
1
@TeresaeJunior Tentu tetapi siapa yang akan menganggap itu masalah? Ini tentang menjaga agar skrip berjalan sepanjang waktu bukan tentang memulainya. Dan Anda dapat membuat tmpfs dari boot.local/ rc.localsehingga Anda tidak memiliki akses disk bahkan jika Anda memulai skrip nanti. Saya baru saja melihat blktrace(tidak tahu itu sebelumnya). Itu sangat mengerikan, saya bertanya-tanya apakah saya akan tidur malam ini ...
Hauke ​​Laging
Ya, saya seharusnya tidak terlalu mengkhawatirkan hal ini lagi, Anda benar lagi. Tapi saya pikir saya juga akan kehilangan tidur malam ini mengkompilasi kernel, karena saya ingin memeriksa semua yang mungkin terus-menerus membangunkan disk, tidak hanya hack Google Earth khusus ini :)
Teresa e Junior
6

Mungkin lebih sederhana, dan lebih dapat diandalkan, untuk mengandalkan window manager Anda atau X11 untuk menangani ini dengan menulis aplikasi X11 "nyata".

Apa yang Anda inginkan dari shell adalah sesuatu yang mendaftar dengan manajer jendela dan menunggu jenis acara yang diinginkan sebelum kembali ke shell ... itu jauh lebih ramah beban jika Anda dapat menghindari perulangan di dalam shell. ( until xdotool...Penyebab Anda dimuat karena tidak ada penundaan (tidur) di dalam loop.)

Ah ... ternyata xdotoolfitur itu ditambahkan lebih dari setahun yang lalu --sync. Itu tidak tersedia di distro Linux saya saat ini (Debian Squeeze), jadi saya belum mencobanya.

Pengembang xdotool menjawab pertanyaan serupa dengan Anda: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ

Carl Cravens
sumber
Ya, tepatnya, -syncseharusnya melakukan apa yang saya inginkan, tetapi perlu whilekarena itu akhirnya akan crash sebelum jendela muncul, dan buang terlalu banyak CPU. Saya benar-benar dikompilasi xdotooldari sumber karena yang dari Debian sangat lambat untuk mengetik. Menulis aplikasi yang berinteraksi langsung dengan X sebenarnya di luar jangkauan saya. Terimakasih Meskipun!
Teresa e Junior