微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash – 等待X窗口出现/消失(以理智的方式)

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] 举报,一经查实,本站将立刻删除。

相关推荐