사용자가 비활성(시스템 유휴) 상태가 되면 명령을 실행하고 싶습니다. 예를 들어:
echo "You started to be inactive."
또한 사용자가 다시 활성화하면(시스템이 더 이상 유휴 상태가 아님):
echo "You started to be active, again."
이를 위해서는 쉘 스크립트가 필요합니다. 타이머/간격 없이 이것이 가능합니까? 어쩌면 시스템 이벤트일까요?
답변1
ArchLinux 포럼의 이 게시물사용자가 유휴 상태인 기간에 대한 정보를 얻기 위해 xscreensaver를 쿼리하는 짧은 C 프로그램이 포함되어 있습니다. 이는 귀하가 요구하는 것과 매우 가까운 것으로 보입니다.
#include <X11/extensions/scrnsaver.h>
#include <stdio.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!dpy) {
return(1);
}
XScreenSaverInfo *info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
printf("%u\n", info->idle);
return(0);
}
다른 이름으로 저장 getIdle.c
하고 컴파일하세요
gcc -o getIdle getIdle.c -lXss -lX11
실행 파일을 가져옵니다 getIdle
. 프로그램은 "유휴 시간"을 밀리초 단위로 인쇄하므로(사용자가 마우스를 움직이거나 클릭하지 않고, 키보드를 사용하지 않음) 이를 기반으로 구축된 bash 스크립트는 다음과 같습니다.
#!/bin/bash
idle=false
idleAfter=3000 # consider idle after 3000 ms
while true; do
idleTimeMillis=$(./getIdle)
echo $idleTimeMillis # just for debug purposes.
if [[ $idle = false && $idleTimeMillis -gt $idleAfter ]] ; then
echo "start idle" # or whatever command(s) you want to run...
idle=true
fi
if [[ $idle = true && $idleTimeMillis -lt $idleAfter ]] ; then
echo "end idle" # same here.
idle=false
fi
sleep 1 # polling interval
done
여전히 주기적인 폴링이 필요하지만 필요한 모든 작업을 수행합니다.
답변2
이것은 정확히 귀하가 요청한 것이 아니지만 항상 batch
- 명령이 있습니다(보통 - 명령의 특수 호출 및 - 데몬 at
에서 사용됨 ).atd
batch
로드 평균이 특정 제한(일반적으로 1.5이지만 시작 시 설정할 수 있음 atd
) 아래로 떨어질 때 명령을 실행하라는 메시지가 표시되도록 합니다. 특정 시간에 실행하는 것이 아니라 해당 시간에 작업을 전달 하고 로드 평균이 떨어지면(예: 로드 평균이 떨어지면) 처음으로 실행되도록 하는 at
방식으로 작업을 프롬프트하는 것도 가능합니다 . batch
1.5 이하에서는 실행됩니다).
안타깝게도 일괄 작업은 끝까지 실행되며 컴퓨터가 더 이상 유휴 상태가 아니어도 중지되지 않습니다.
+++
프로그래밍 방식의 경로로 가야 한다면(다른 답변의 경우인 것 같습니다) 로그인한 사용자 및/또는 로드 평균을 모니터링하는 데몬 atd
이나 비슷한 것을 만들어 볼 것입니다. crond
그런 다음 데몬은 디렉터리에서 스크립트/프로그램을 실행하고 필요에 따라 이를 시작/계속하거나 중지(신호를 사용하여)할 수 있습니다.
답변3
bash의 TMOUT은 설정된 시간(초) 후에 대화형 세션을 종료합니다. 이 메커니즘을 사용할 수 있습니다.
적절한 트랩을 설정하거나(테스트하지는 않음) bash-logout-scripts(~/.bash_logout)를 사용하여 로그아웃을 포착할 수 있습니다.
답변4
다른 답변이 화면 보호기나 bash 유휴 타이머를 사용하거나 .bash_logout에서 실행하는 것처럼 일종의 시스템 통계를 폴링하지 않고 이 작업을 수행할 수 있는 방법은 없지만 여기에 CPU 사용량 아이디어를 확인하는 방법이 있습니다.
여기에는 여전히 n초마다 폴링이 포함되므로 CPU 사용량이 선택한 양 이하로 떨어지면 실행할 스크립트를 작성할 수 있습니다. 그러나 무엇을 실행하든 CPU 사용량이 증가할 가능성이 높지만 "작업"에 Nice를 사용하여 계산하지 않을 수 있습니다.
이것은 top을 사용하는 테스트 스크립트이지만 대신 mpstat를 사용하거나 로드 평균을 확인할 수 있습니까?
while true
do
idle=$(top -bn2 | grep "Cpu(s)"|tail -n 1|sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
echo "idle is $idle"
if [[ $idle > 90 ]]
then
echo "idle above 90%"
echo "Do stuff now"
else
echo "idle below 90%"
echo "Stop doing stuff now"
fi
sleep 1
done
이것은 위에서부터 유휴 데이터 읽기를 테스트하기 위해 작성한 스크립트입니다. 파싱할 수는 있지만 /proc/stat
총 시간만 보여주고, 간격 내에서 결과를 비교해야 한다고 생각합니다. Top에는 나에게 고유한 문제가 있습니다(리눅스 민트 16). 처음 실행에서는 /proc/stat 자체가 구문 분석될 때까지 기다려야 하는 것처럼 cpustats를 변경하지 않는 것 같으므로 이론적으로는 작동 top -bn2
해야 합니다 top -bn1
.