0

デーモンからファイルを監視するより効率的な方法を探しています。いくつかのファイル (/proc/btn_sw1および/proc/btn_sw2) を監視するためにループするスクリプトを作成しました... ループが悪い考えであることは知っていましたが、それがどれほど悪いことかはわかりませんでした。

デーモンは init プロセスを介して自動的に開始され、起動後にtop出力を確認したところ、私のプロセスは常に ~17% の CPU を実行している #1 でした。

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
4

1 に答える 1

0

inotify-toolsこれにはパッケージが必要です。(/proc ファイルで動作するかどうかはわかりませんが、試してみる価値はあります)。

このようなもの:

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

編集:逆引用符の構文は廃止されました。推奨される構文は$(command)です。

于 2014-02-20T19:21:53.087 に答える