【问题标题】:Efficient file checking in a Linux daemonLinux 守护进程中的高效文件检查
【发布时间】:2014-02-21 03:53:51
【问题描述】:

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

【问题讨论】:

  • 可以直接查md5吗?命令md5md5sum 可用于确认文件是否被更改。直接cat文件性能应该会更好。

标签: linux bash shell filesystems procfs


【解决方案1】:

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

类似这样的:

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

编辑反引号语法已过时,推荐语法为$(command)

【讨论】:

  • 这是唯一的选择?一个外部包?我希望可能会建造一些东西。我正在开发嵌入式环境,因此我需要获取代码并交叉编译我包含的任何额外内容。
  • inotify-tools 只是 inotify 子系统的一个接口(自 2.6.13 起包含在内核中)。您也可以编写自己的 C 程序来直接访问它,但我不知道有任何 shell 内置工具可以做同样的事情。
  • 一个穷人的解决办法是在主循环的末尾添加一个sleep 1 调用,这样你每秒只轮询一次更改。如果时间必须更准确,这可能不适合您。
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2015-11-09
相关资源
最近更新 更多