デーモンからファイルを監視するより効率的な方法を探しています。いくつかのファイル (/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