Linux가 5 분 동안 유휴 상태 인 경우 명령 실행


16

다음과 같은 명령을 실행하고 싶습니다

 notify-send 'a'

내 Linux 시스템이 5 분 동안 유휴 상태 인 경우

유휴 상태이므로 활성화 된 화면 보호기가 "유휴"를 정의하는 데 사용하는 것과 같은 의미입니다.


좋아, 당신은 무엇을 시도 했습니까? 구글은 무엇을 말 했는가? 스크린 세이버에서이를 감지하는 방법을 찾으셨습니까? 여기에 질문을 게시하기 전에 검색 하고 좋은 질문하는 방법을 읽어보십시오 .
terdon

프로그램 만 찾았 xautolock지만 예제는 없습니다

답변:


20

xprintidleX 유휴 시간을 찾기 위해 호출 된 프로그램 을 사용합니다. 스크린 세이버와 동일한 데이터 소스를 사용한다고 추측합니다. xprintidle더 이상 업스트림이없는 것처럼 보이지만 데비안 패키지 는 살아 있고 좋습니다.

그것은 매우 간단한 응용 프로그램입니다. 마지막 X 상호 작용 이후 밀리 초의 양을 반환합니다.

$ sleep 1 && xprintidle
940
$ sleep 5 && xprintidle
4916
$ sleep 10 && xprintidle
9932

(참고 : 기본 시스템으로 인해 "실제"유휴 시간보다 약간 낮은 ms 값을 일관되게 제공합니다.

다음을 통해 5 분의 유휴 시간 후에 특정 시퀀스를 실행하는 스크립트를 만들 수 있습니다.

#!/bin/sh

# Wanted trigger timeout in milliseconds.
IDLE_TIME=$((5*60*1000))

# Sequence to execute when timeout triggers.
trigger_cmd() {
    echo "Triggered action $(date)"
}

sleep_time=$IDLE_TIME
triggered=false

# ceil() instead of floor()
while sleep $(((sleep_time+999)/1000)); do
    idle=$(xprintidle)
    if [ $idle -ge $IDLE_TIME ]; then
        if ! $triggered; then
            trigger_cmd
            triggered=true
            sleep_time=$IDLE_TIME
        fi
    else
        triggered=false
        # Give 100 ms buffer to avoid frantic loops shortly before triggers.
        sleep_time=$((IDLE_TIME-idle+100))
    fi
done

100ms 오프셋은 이전에 언급 한 단점 때문에 xprintidle 이와 같이 실행될 때 항상 "실제"유휴 시간보다 약간 낮은 시간을 반환하는 발생합니다. 이 오프셋없이 작동하고 10 분의 1 초까지 더 정확하지만 xprintidle간격이 끝나기 전에 마지막 밀리 초 동안 열광적으로 검사 를 트리거합니다 . 어떤 식 으로든 성능이 뛰어나지는 않지만 나는 그 우아하지 않은 것을 발견 할 것입니다.

필자는 꽤 오랫동안 Perl 스크립트 (irssi 플러그인)에서 비슷한 접근 방식을 사용했지만 위의 내용은 방금 작성되었으며 작성하는 동안 몇 가지 시험 실행을 제외하고는 실제로 테스트되지 않았습니다.

X 내의 터미널에서 실행하여 시도하십시오. 테스트를 위해 시간 제한을 예를 들어 5000ms로 설정하고 set -x아래 #!/bin/sh에 직접 추가하여 작동 방식을 알기위한 정보 출력을 얻는 것이 좋습니다 .


5

나는 xssstate그런 목적으로 사용 합니다. 데비안 또는 우분투 또는 업스트림suckless-tools 패키지로 제공됩니다 .

그런 다음 다음 셸 스크립트를 사용할 수 있습니다.

#!/bin/sh

if [ $# -lt 2 ];
then
    printf "usage: %s minutes command\n" "$(basename $0)" 2>&1
    exit 1
fi

timeout=$(($1*60*1000))
shift
cmd="$@"
triggered=false

while true
do
    tosleep=$(((timeout - $(xssstate -i)) / 1000))
    if [ $tosleep -le 0 ];
    then
        $triggered || $cmd
        triggered=true
    else
        triggered=false
        sleep $tosleep
    fi
done

1

다음은 컴파일 할 수있는 C 응용 프로그램입니다.

$ more xidle.c 
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>

/* Report amount of X server idle time. */
/* Build with- */
/* cc xidle.c -o xidle -lX11 -lXext -lXss */


int main(int argc, char *argv[])
{
    Display *display;
    int event_base, error_base;
    XScreenSaverInfo info;
    float seconds;

    display = XOpenDisplay("");

    if (XScreenSaverQueryExtension(display, &event_base, &error_base)) {
    XScreenSaverQueryInfo(display, DefaultRootWindow(display), &info);

    seconds = (float)info.idle/1000.0f;
    printf("%f\n",seconds);
    return(0);
    }
    else {
    fprintf(stderr,"Error: XScreenSaver Extension not present\n");
    return(1);
    }
}

빌드하려면 몇 개의 라이브러리가 필요합니다. Fedora 19 시스템에는 다음 라이브러리가 필요했습니다.

$ rpm -qf /lib64/libX11.so.6 /lib64/libXext.so.6 /lib64/libXss.so.1
libX11-1.6.0-1.fc19.x86_64
libXext-1.3.2-1.fc19.x86_64
libXScrnSaver-1.2.2-5.fc19.x86_64

이것들이 설치되면 위와 같이 컴파일했습니다.

$ gcc xidle.c -o xidle -lX11 -lXext -lXss

다음과 같이 X를 실행하여 X가 유휴 시간으로 감지하는 시간 (초)을보고 할 수 있음을 알 수 있습니다.

$ while [ 1 ]; do ./xidle ; sleep 2;done
0.005000
1.948000
3.954000
5.959000
7.965000
0.073000   <--- moved the mouse here which resets it
0.035000

이 실행 파일을 사용하면에서보고 한 유휴 시간을 모니터링하여 이와 같은 작업을 수행 할 수있는 스크립트를 만들 수 있습니다 xidle.

$ while [ 1 ]; do idle=$(./xidle); 
    [ $( echo "$idle > 5" | bc ) -eq 0 ] && echo "still < 5" || echo "now > 5"; 
    sleep 2;
done
still < 5
still < 5
still < 5
now > 5
now > 5
still < 5
still < 5
still < 5

위의 내용은 still < 55 초의 유휴 시간이 경과 할 때까지 표시 되며,이 시점에서이라고 말하기 시작합니다 now > 5. 이는 5 초 이상을 의미합니다.

참고 :notify-send 'a' 위의 예 에을 포함시킬 수 있습니다 .

참고 문헌


-1

BSD 포트 (패키지 컬렉션)이 작업을 수행 할 수있는 프로그램이 있습니다
http://man.openbsd.org/OpenBSD-current/man1/xidle.1
이 가능한 예는 여기 :
http://distcache.freebsd.org/local- distfiles / novel / xidle-26052015.tar.bz2

다음과 같이 빌드하십시오.

 # apt-get install libxss-dev # for include/X11/extensions/scrnsaver.h
 # gcc -o /usr/local/bin/xidle xidle.c -lX11 -lXss

-program은 execv ()로 전달 된 바이너리의 전체 경로를 포함해야합니다.

$ xidle -timeout 120 -program "/usr/bin/xlock -mode pyro"  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.