在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)!
解决方法:
这应该给你所有(好的:大多数.我忘了什么?套接字?)文件系统活动,包括写入:
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
有了这些信息,就可以在tmpfs中创建一个工作的chroot环境(作为最后的手段;也许是对tmpfs的符号链接就足够了).如果程序在RAM chroot中启动,则它没有机会直接唤醒磁盘.不会将对其文件系统层次结构的写入写入磁盘.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。