Linux守护程序中的高效文件检查

时间:2014-02-20 18:48:29

标签: linux bash shell filesystems procfs

我正在寻找一种更有效的监控来自我的守护程序的文件的方法。我写了一个脚本循环来观看几个文件(/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

1 个答案:

答案 0 :(得分:0)

您需要inotify-tools包。 (不确定它是否适用于/ proc文件,但值得一试)。

这样的事情:

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

修改反引用语法已过时,推荐语法为$(command)