X 창이 나타나거나 사라질 때까지 기다립니다(일반적인 방법)

X 창이 나타나거나 사라질 때까지 기다립니다(일반적인 방법)

쉘 스크립트에서는 제목에 문자열이 있는 창이 나타날 때까지 기다렸다가 몇 가지 작업을 수행한 다음 창이 사라질 때까지 기다린 다음 다른 작업을 수행해야 합니다.

어제까지 나는 이 간단한 코드를 가지고 있었습니다. 문제는 스크립트가 실행되는 동안 디스크가 절전 상태로 들어갈 수 없으며 몇 시간 동안 지속될 수 있다는 것입니다.

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충돌이 발생하고 이상한 결과가 나올 뿐만 아니라(이전에 해결한 것처럼) 창이 나타날 때까지 기다리는 동안 CPU의 약 15%를 소모합니다. 이것이 의미하는 바는 디스크를 깨우는 단순한 코드에서 벗어나, 우선적으로 전력을 절약하는 것이 목표일 때 몇 시간의 CPU 시간을 낭비하는 코드를 작성한다는 것입니다.
  • xprop -spy포커스를 변경할 때마다(해결 방법을 거쳤습니다 ) 또는 창이 생성 및 삭제될 때마다 $_line알림을 받습니다 . 이는 xdotool보다 더 자주 디스크를 깨웁니다.

$string제목이 있는 창이 나타나거나 사라질 때 까지 기다리는 간단한 프로그램을 찾고 있습니다 . 기존 명령줄 도구, Python 스크립트, 컴파일 가능한 C 코드일 수 있지만 어떻게든 내 스크립트에 통합할 수 있어야 합니다(단지 fifo에 일부 정보를 쓰는 경우에도)!

답변1

"실제" X11 응용 프로그램을 작성하여 이 문제를 처리하려면 창 관리자나 X11에 의존하는 것이 더 간단하고 안정적일 수 있습니다.

쉘에서 원하는 것은 창 관리자에 등록하고 쉘로 돌아가기 전에 원하는 이벤트 유형을 기다리는 것입니다... 쉘 내부에서 루프를 피할 수 있다면 로드 친화적일 것입니다. ( until xdotool...루프 내부에는 지연(휴면)이 없기 때문에 이유는 로드 때문입니다.)

아... xdotool그 기능은 1년 전에 추가된 것 같군요 --sync. 현재 Linux 배포판(Debian Squeeze)에서는 이 기능을 사용할 수 없으므로 아직 시도하지 않았습니다.

xdotool 개발자는 귀하와 유사한 질문에 답변했습니다. https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ

답변2

이것은 쓰기를 포함한 모든 파일 시스템 활동(알겠습니다: 대부분. 제가 잊어버린 게 있나요? 소켓?)을 제공해야 합니다.

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에서 시작되면 디스크를 직접 깨울 가능성이 없습니다. 파일 시스템 계층 구조에 대한 쓰기는 디스크에 기록되지 않습니다.

관련 정보