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 xdotool
chờ cửa sổ xuất hiện và xprop
tì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:
xdotool
khô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 -spy
sẽ 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 đề $string
xuấ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)!
fatrace
để kiểm tra đánh thức đĩa và nó cho tôi bash
đọc /bin/sleep
và /usr/bin/wmctrl
cứ 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?
btrace
từ blktrace
để điều tra các nguồn hoạt động của đĩa.
xwininfo
có 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.
strace -f -e trace=file wmctrl -l
nên được thông tin.