2014-02-20 26 views
0

我正在寻找一种更高效的监控来自守护进程的文件的方法。我写了一个脚本,循环观看几个文件(/proc/btn_sw1/proc/btn_sw2)...我知道循环是一个坏主意,我没有意识到如何坏将是。Linux守护进程中的高效文件检查

我的守护程序通过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程序直接访问,但我不知道任何shell-builtin工具可以做同样的事情。 –

+0

一个穷人的解决方法是在主循环结尾处添加一个“睡眠1”调用,以便每秒只调查一次更改。如果时间必须更精确,这可能不是您的选择。 –