답변:
xprintidle
X 유휴 시간을 찾기 위해 호출 된 프로그램 을 사용합니다. 스크린 세이버와 동일한 데이터 소스를 사용한다고 추측합니다. 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
에 직접 추가하여 작동 방식을 알기위한 정보 출력을 얻는 것이 좋습니다 .
나는 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
다음은 컴파일 할 수있는 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 < 5
5 초의 유휴 시간이 경과 할 때까지 표시 되며,이 시점에서이라고 말하기 시작합니다 now > 5
. 이는 5 초 이상을 의미합니다.
참고 :notify-send 'a'
위의 예 에을 포함시킬 수 있습니다 .
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"