시스템이 유휴 상태일 때와 다시 활성화될 때 명령을 실행합니다.

시스템이 유휴 상태일 때와 다시 활성화될 때 명령을 실행합니다.

사용자가 비활성(시스템 유휴) 상태가 되면 명령을 실행하고 싶습니다. 예를 들어:

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방식으로 작업을 프롬프트하는 것도 가능합니다 . batch1.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.

관련 정보