X 윈도우가 나타나거나 사라질 때까지 기다립니다 (정상적인 방식으로)


11

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

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

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이 있는 창이 나타나거나 사라질 때까지 기다리는 간단한 프로그램을 찾고 있습니다. 기존 명령 줄 도구, 파이썬 스크립트, 컴파일 가능한 C 코드 일 수 있지만 어떻게 든 정보를 fifo에 쓰더라도 스크립트에 통합 할 수 있어야합니다!


1
이전 코드가 디스크를 깨우고 솔루션을 찾는 이유를 찾는 것이 합리적이지 않습니까? chroot와 램 디스크 같은 것. strace -f -e trace=file wmctrl -l유익한 정보가 될 것 같습니다 .
Hauke ​​Laging

fatrace디스크 웨이크 업을 확인 하는 데 사용 하고 있으며 bash읽기 /bin/sleep/usr/bin/wmctrl반 초마다 알려주므로 실제로 창 이벤트를 기다리는 일부 프로그램을 찾고 있습니다. 뭔가 빠졌습니까?
Teresa e Junior

1
디스크를 1 초에 두 번 실행하면 캐시 될 가능성이 있으므로 디스크를 깨우지 않습니다. noatime으로 파일 시스템을 마운트 했습니까? 디스크 활동 소스를 조사하려면 btracefrom blktrace을 참조하십시오 .
Stéphane Chazelas

1
아직 보지 않았다면 xwininfowmctrl보다 훨씬 적은 공유 라이브러리를로드하고 베어 X에 가까운 수준에서 작동합니다.
msw

1
@msw Google 어스의 자동 저장 기능인 수정 불가능한 문제를 해결하려고합니다 (닫힌 소스 및 버그보고는 시간 낭비입니다)
Teresa e Junior

답변:


4

이렇게하면 쓰기를 포함한 모든 파일 시스템 활동 (확인 : 대부분. 잊어 버린 소켓?)이 제공됩니다.

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


나는 파일을 읽을 때 적어도 처음으로 디스크를 깨울 때가 있다고 생각합니까? 만약 내가 궁금하네요 blktrace그에 적합한 도구가 될 것입니다,하지만이 필요 커널 컴파일 # CONFIG_BLK_DEV_IO_TRACE is not set:( 감사하지만,이 질문의 범위를 넘어 그.!
테레사 주니어 전자

1
@TeresaeJunior 물론 그 문제를 누가 고려할 것입니까? 스크립트를 시작하는 것이 아니라 항상 스크립트를 계속 실행하는 것입니다. 그리고 나중에 스크립트를 시작하더라도 디스크에 액세스 할 수 없도록 boot.local/ 에서 tmpfs를 만들 수 있습니다 rc.local. 방금 살펴 봤습니다 blktrace(이전에는 몰랐습니다). 오늘 밤에 잠을자는 지 궁금합니다.
Hauke ​​Laging

예, 더 이상 걱정하지 않아도됩니다. 다시 그렇습니다. 하지만이 특정 Google Earth 핵뿐만 아니라 디스크를 지속적으로 깨울 수있는 모든 항목을 확인하고 싶기 때문에 오늘 밤 커널을 컴파일하는 잠을 잃게 될 것입니다. :)
Teresa e Junior

6

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

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

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

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


그렇습니다. 정확하게, -sync내가 원하는 것을해야했지만 while창이 나타나기 전에 결국 충돌하고 너무 많은 CPU를 낭비하기 때문에 필요합니다 . xdotool데비안에서 나온 것이 엄청나게 느리기 때문에 소스에서 실제로 컴파일 했습니다. X와 직접 상호 작용하는 응용 프로그램 작성은 실제로 저쪽에 있습니다. 그래도 고마워!
Teresa e Junior
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.