在shell脚本中,我需要等待标题上带有字符串的窗口出现,执行一些操作,然后等待它消失,然后执行其他操作。
直到昨天,我才有了这个简单的代码。这样做的问题是,脚本保持运行状态时,无法将磁盘置于省电状态,并且可能会持续多个小时:
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
自从我确定所提到的代码疯狂地唤醒磁盘以来,我浏览了一些命令行工具的文档,并决定xdotool
等待窗口出现,并xprop
确定窗口何时消失:
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
现在,上面的代码有两个新问题:
xdotool
正如我之前解决过的那样,不仅崩溃并给出奇怪的结果,而且在等待窗口出现时还占用了大约15%的CPU。因此,这意味着我摆脱了唤醒磁盘的简单代码,编写了浪费CPU数小时的代码,而我的初衷是节省电源。xprop -spy
每当我更改焦点(已通过解决方法$_line
)或创建和销毁窗口时,都会通知我。这比xdotool更频繁地唤醒磁盘。
我正在寻找一个简单的程序,仅等待带有标题的窗口$string
出现或消失。它可以是现有的命令行工具,python脚本,可编译的C代码...,但我应该能够以某种方式将其集成到脚本中(即使它只是将一些信息写入到fifo中)!
fatrace
用来检查磁盘唤醒,它告诉我bash
读取/bin/sleep
和/usr/bin/wmctrl
每半秒,这就是为什么我要寻找一些实际上会等待窗口事件的程序。我想念什么吗?
btrace
从blktrace
以调查磁盘活动的来源。
xwininfo
可能会有用,它肯定会比wmctrl加载更少的共享库,并且运行的水平更接近裸X。–
strace -f -e trace=file wmctrl -l
应该能提供很多信息。