Đợi cửa sổ X xuất hiện / biến mất (theo cách lành mạnh)


11

Bên trong một tập lệnh shell, tôi cần đợi một cửa sổ có một chuỗi trên tiêu đề của nó xuất hiện, thực hiện một số hành động và sau đó chờ cho nó biến mất và thực hiện một số hành động khác.

Cho đến ngày hôm qua, tôi đã có mã đơn giản này. Vấn đề với nó là đĩa không thể được đặt ở trạng thái tiết kiệm năng lượng trong khi tập lệnh vẫn chạy và có thể trong nhiều giờ:

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

Vì tôi quyết định mã được đề cập là đánh thức điên cuồng đĩa, tôi đã xem qua tài liệu của một vài công cụ dòng lệnh và quyết định xdotoolchờ cửa sổ xuất hiện và xproptìm ra khi cửa sổ biến mất:

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

Bây giờ tôi có hai vấn đề mới với mã ở trên:

  • xdotoolkhông chỉ gặp sự cố và cho kết quả lạ, như tôi đã giải quyết trước đó, nhưng nó cũng hút khoảng 15% CPU trong khi chờ cửa sổ xuất hiện. Vì vậy, điều đó có nghĩa là tôi đã loại bỏ mã đơn giản đánh thức đĩa, để viết mã bị lãng phí CPU trong nhiều giờ và ý định của tôi là tiết kiệm năng lượng ngay từ đầu.
  • xprop -spysẽ thông báo cho tôi mỗi khi tôi thay đổi tiêu điểm (mà tôi đã khắc phục được $_line) hoặc tạo và phá hủy các cửa sổ. Điều đó đánh thức đĩa thường xuyên hơn xdotool.

Tôi đang tìm kiếm một chương trình đơn giản chỉ chờ cửa sổ với tiêu đề $stringxuất hiện hoặc biến mất. Nó có thể là một công cụ dòng lệnh hiện có, tập lệnh python, mã C có thể biên dịch được ..., nhưng tôi có thể tích hợp nó bằng cách nào đó vào tập lệnh của mình (ngay cả khi nó chỉ ghi một số thông tin vào fifo)!


1
Sẽ không có lý khi tìm hiểu tại sao mã cũ của bạn đánh thức đĩa và tìm kiếm giải pháp? Một cái gì đó như chroot và ramdisk. Tôi đoán strace -f -e trace=file wmctrl -lnên được thông tin.
Hauke ​​Laging

Tôi đang sử dụng fatraceđể kiểm tra đánh thức đĩa và nó cho tôi bashđọc /bin/sleep/usr/bin/wmctrlcứ sau nửa giây, đó là lý do tại sao tôi đang tìm kiếm một chương trình thực sự sẽ chờ đợi các sự kiện cửa sổ. Tui bỏ lỡ điều gì vậy?
Teresa e Junior

1
đọc những thứ đó sẽ không đánh thức đĩa vì chúng có thể sẽ được lưu trong bộ nhớ cache nếu chúng được chạy hai lần mỗi giây. Bạn đã gắn kết hệ thống tập tin của bạn với noatime? Xem thêm btracetừ blktraceđể điều tra các nguồn hoạt động của đĩa.
Stéphane Chazelas

1
Nếu bạn chưa xem nó xwininfocó thể được sử dụng, chắc chắn nó sẽ tải các thư viện chia sẻ ít hơn nhiều so với wmctrl và hoạt động ở mức gần với X.
msw

1
@msw Tôi đang cố gắng sửa lỗi không thể trộn được, đó là một tính năng tự động lưu cho Google Earth (đóng lỗi và báo cáo lỗi là một sự lãng phí thời gian)
Teresa e Junior

Câu trả lời:


4

Điều này sẽ cung cấp cho bạn tất cả (OK: hầu hết. Tôi đã quên điều gì? Sockets?) Các hoạt động hệ thống tệp bao gồm ghi:

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

Với thông tin này, môi trường chroot hoạt động có thể được tạo trong tmpfs (như một hành động của giải pháp cuối cùng; có thể liên kết tượng trưng đến tmpfs là đủ). Nếu chương trình được khởi động trong RAM chroot thì nó không có cơ hội đánh thức đĩa trực tiếp. Không ghi vào hệ thống phân cấp tập tin của nó được ghi vào đĩa.


Tôi tin rằng có những lúc đọc một tập tin, ít nhất là lần đầu tiên, cũng sẽ đánh thức đĩa, phải không? Tôi đang tự hỏi liệu đây blktracecó phải là công cụ phù hợp cho việc đó không, nhưng nó sẽ yêu cầu biên dịch kernel # CONFIG_BLK_DEV_IO_TRACE is not set:( Tuy nhiên, điều đó nằm ngoài phạm vi của câu hỏi này. Cảm ơn bạn!
Teresa e Junior

1
@TeresaeJunior Chắc chắn nhưng ai sẽ coi đó là một vấn đề? Đây là về việc giữ cho kịch bản chạy mọi lúc chứ không phải về việc bắt đầu nó. Và bạn có thể tạo các tmpfs từ boot.local/ rc.localđể bạn không có quyền truy cập đĩa ngay cả khi bạn khởi động tập lệnh sau. Tôi chỉ có một cái nhìn blktrace(không biết điều đó trước đây). Điều đó thật kinh khủng, tôi tự hỏi liệu tôi có được ngủ đêm nay không ...
Hauke ​​Laging

Vâng, tôi không thực sự lo lắng về điều này nữa, bạn lại đúng. Nhưng tôi nghĩ rằng tôi cũng sẽ mất đêm ngủ để biên dịch kernel, vì tôi muốn kiểm tra mọi thứ có thể đánh thức liên tục trên đĩa, không chỉ riêng bản hack Google Earth này :)
Teresa e Junior

6

Có thể đơn giản và đáng tin cậy hơn, dựa vào trình quản lý cửa sổ hoặc X11 của bạn để xử lý việc này bằng cách viết một ứng dụng X11 "thực".

Những gì bạn muốn từ shell là thứ gì đó đăng ký với trình quản lý cửa sổ và chờ đợi một loại sự kiện mong muốn trước khi quay lại shell ... nó thân thiện với tải hơn nhiều nếu bạn có thể tránh vòng lặp bên trong shell. ( until xdotool...Nguyên nhân của bạn tải vì không có độ trễ (ngủ) trong vòng lặp.)

À ... rõ ràng xdotoolcó tính năng đó được thêm vào hơn một năm trước --sync. Điều đó không có sẵn trong bản phân phối Linux hiện tại của tôi (Debian Squeeze), vì vậy tôi đã không dùng thử.

Nhà phát triển xdotool trả lời một câu hỏi tương tự với bạn: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ


Vâng, chính xác, -syncđáng ra phải làm những gì tôi muốn, nhưng nó cần whilebởi vì cuối cùng nó sẽ sụp đổ trước khi cửa sổ xuất hiện và lãng phí quá nhiều CPU. Tôi thực sự đã biên dịch xdotooltừ nguồn bởi vì cái từ Debian rất chậm gõ. Viết một ứng dụng tương tác trực tiếp với X thực sự nằm ngoài tôi. Cảm ơn, mặc dù!
Teresa e Junior
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.