2014-02-20 3 views
0

데몬에서 파일을보다 효율적으로 모니터링하는 방법을 찾고 있습니다. 나는 두 파일 (/proc/btn_sw1/proc/btn_sw2)을 보려고 반복하는 스크립트를 썼다 ... 나는 루핑이 나쁜 아이디어라는 것을 알고, 나는 깨닫지 못했다. 어떻게 나쁜 것일까.리눅스 데몬에서 효율적인 파일 검사

내 데몬이 자동으로 init 프로세스를 통해 시작되고, 그것이 시작 후 나는 top 출력을 확인하고 내 프로세스가 지속적으로 # 1 실행 ~ 17 %의 CPU를했다 :

PID PPID USER  STAT VSZ %VSZ %CPU COMMAND 
1698  1 root  S  2196 0% 17% {resetd.sh} /bin/sh /etc/init.d/resetd 

내 데몬이/PROC 항목을 모니터링 (그 값은 단지 1 또는 0입니다). 하드웨어 버튼을 눌렀거나 놓을 때 키패드 드라이버가 설정합니다. 그래서이 파일의 가치가 언제 바뀌는 지 알아야합니다.

파일의 값이 변경되면 내 데몬이 깨어날 수있는 방법이 있습니까? 참고 : 버튼을 얼마나 오랫동안 누르고 있었는지 타임 아웃해야하기 때문에 각 읽기 사이에 X 초 동안 잠자고 싶지는 않습니다. 시작을 놓치지 않으려 고합니다.

나의 현재 데몬 코드 :

#!/bin/sh 

proc1file=/proc/btn_sw1 
proc2file=/proc/btn_sw2 
BTN1VAL=$(cat $proc1file) 
BTN2VAL=$(cat $proc2file) 

tic=0 
elap_time=0 
reset_met=0 

until [ $reset_met -gt 0 ] 
do 
    BTN1VAL=$(cat $proc1file) 
    BTN2VAL=$(cat $proc2file) 
    if [ $BTN1VAL -gt 0 ] && [ $BTN2VAL -gt 0 ] 
    then 
    tic=`date +%S` 

    # Start the 10second loop, I'm ok with reading in here, but before this I'd like 
    # to be sleeping or idle instead of constantly polling 
    until [ $elap_time -ge 5 ] || [ $BTN1VAL -lt 1 ] || [ $BTN2VAL -lt 1 ] 
    do 
     BTN1VAL=$(cat $proc1file) 
     BTN2VAL=$(cat $proc2file) 
     toc=`date +%S` 
     elap_time=`expr $toc - $tic` 
    done 
    if [ $elap_time -ge 5 ] 
    then 
     reset_met=1 
    else 
     elap_time=0 
    fi 
    fi 

done 
echo "Rebooting!" 
reboot -f 
+0

md5를 직접 확인할 수 있습니까? 'md5' 또는'md5sum' 명령을 사용하여 파일이 변경되었는지 여부를 확인할 수 있습니다. 퍼포먼스는 고양이에게 직접적으로 더 낫다. – BMW

답변

0

이에 대한 inotify-tools 패키지가 필요합니다. (/ proc 파일과 함께 작동하는지 확실하지 않지만 시도해 볼 가치가 있습니다.) 이 같은

뭔가 :

until [ $reset_met -gt 0 ] 
do 
    inotifywait "$proc1file" "$proc2file" 
    tic=$(date +%S) 
    ... 
done 

편집 다음 역 인용 부호 구문이 사용되지는 권장 구문은 $(command)입니다.

+0

그게 유일한 옵션이야? 외부 꾸러미? 나는 무언가가 지어지기를 바랐다. 임베디드 환경에서 작업 중이므로 코드를 가져와 내가 포함하는 추가 컴파일 작업을 수행해야합니다. – Mike

+0

inotify-tools는 inotify 서브 시스템 (2.6.13 이후 커널에 포함)에 대한 인터페이스 일뿐입니다. 직접 액세스하는 자신의 C 프로그램을 작성할 수도 있지만 같은 일을하는 모든 쉘 내장 기능을 알지 못합니다. –

+0

가난한 사람의 수정은 주 루프 끝에 'sleep 1' 호출을 추가하여 매초마다 변경 사항을 폴링하는 것입니다. 타이밍이 정확해야하는 경우 옵션이 아닐 수도 있습니다. –