ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

ログファイルを見るのはtail -f でなくて、less +Fを使うのが今風らしい

tail -f

垂れ流しているログファイルを確認するのには、tailコマンドに-fのオプションを付けると良い、と昔に聞いたことがあり、ずっとそれで見てきた。

tail -f

tailコマンドは、そのファイルを後ろから開くコマンドで、-fオプションをつけると更新された部分もどんどん読み込んでくれる。

しかし、いったんそこで読み込みを止めたい、再開したい、というのができない。(できないよね?)

f:id:mczh:20170220230523p:plain Photo by dadriaen | Pixabay / CC BY 0

less +F

そこで、lessコマンドを使う。

lessコマンドはファイル閲覧のコマンドで、これまではエディタを立ち上げるまでもなく、さっと中身を確認したいときに使っていた。

ただ見るだけでなく、ファイルを開いているときに/PATTERNや?PATTERNで検索できるので、利便性が高い。

このlessコマンドは、実は+Fを引数に渡すと、tail -fと同じようなモードになる。画面下には、以下の文字が表示される。

Waiting for data... (interrupt to abort)

この状態でinterrupt、つまりCtrl+cをしてみると、lessコマンドで開いたままの状態になる。 そこからまたShift+fを入力すると、tail -fと同じモードになる。

ちなみに、lessで読み込んでからShift+fでも更新読み込みモードになる。

という具合で、ほぼtail -fの上位互換的にless +Fが使えることがわかったので、今後はless +Fを使おうと思う。

+とわざわざ打つのが少しめんどくさいが。

自分が帰宅しているかをRaspberryPiで検知する簡単な方法

I’m home

いつかのブログにも書いたかもしれないが、RaspberryPiで色々センサーをいじれるように遊んでいると、「自分が家にいるときだけ」という処理をしたくなる。

しかし、近接センサーは近くしか見ないし、照度センサーは窓の近くだと結構変わるし、わざわざそのためにBLEを使うのも……。

という場合に、簡単な方法として、自分のスマホのIPへpingを打って返り値を確認するという方法がある。

家に無線LANの環境があり、スマホだけ自宅にあるという状態がないのが前提である。

せっかくRaspberryPiなのにセンサー使わないのかよ!というのはあるが、手段よりも目的重視で……。

f:id:mczh:20170220221353p:plain Photo by geralt | Pixabay / CC BY 0

スマホの準備

まず、自分のスマホを固定IPにしておく。DHCPで他のマシンに取られないように、ちょっと外れた番号にしておくと良い。たとえば192.168.1.20など。

Linuxのpingは止めるまで打ち続ける仕様

Windowsのコマンドプロンプトから打つと数回で勝手に止まるが、Linuxから打つと無限に打ち続けるようだ。いつも無意識に止めていたから気が付かなかった。

しかし、無限に打ち続けられてしまうと返り値が取得できない。

どうせなら失敗したら返ってくるとか、成功するまでは打ち続けるとか、そのようなオプションがあれば楽だったが、見当たらない。

しかたがないので、指定した回数だけpingを打って、一旦その結果を取得して、その結果によって更にループさせたりbreakさせたりする必要がある。

指定した回数だけpingを飛ばす

指定した回数だけ実行させるには、-cのオプションをつける。

ping -c 回数 192.168.1.20

今回の目的では、1回pingを実行してスリープさせて、またpingを実行して、のループがいいだろう。

サンプルコード

#!/bin/sh
PING_TARGET="192.168.1.20"

MAX_SECOND=108000
SLEEP_SEC=5

#loop until ping success
count=$MAX_SECOND
success_count=0
THRESHOLD=5
while [ $count -ge 0 ] ; do
    ping ${PING_TARGET} -c 1 >> /dev/null
    rc=$?
    if [ $rc -eq 0 ] ; then
        if [ $success_count -eq $THRESHOLD ] ; then
            break
        fi
        success_count=`expr $success_count + 1`
    else
        success_count=0 #reset
    fi
    sleep $SLEEP_SEC
    count=`expr $count - $SLEEP_SEC`
done

if [ $rc -eq 0 ] ; then
   # 処理
fi

変数は適当に変える。 このサンプルは、5秒に一度pingを打ち、5回連続で成功すればbreakして、処理を実行する。 最大待ち時間は、約108000秒(6時間)にしてある。

このコードは、自宅に帰ったら勝手に照明をつけるためにRaspberryPiに仕込んでいるコードの抜粋である。

このスクリプトを、仕事の定時にcrontabで自動実行するようにしている。 すると、定時~6時間以内に家に着けば、勝手に電気がついてくれる。

ちなみに、シェルスクリプトのデバッグで困ったときは、

#!/bin/sh

の部分を、

#!/bin/sh -x

に変更すると、行ごとの処理をすべて表示してくれるのでわかりやすい。

問題点

問題点は、自宅にいながらスマホの電源が切れたりwifiが切れたりした場合である。

そのあたりは反応性の良さとのトレードオフなので、しきい値やチェック間隔を調整していい感じにしよう。

翔泳社とは別に、プログラミング・IT技術書フェアで50%OFFセール中(2/23まで)

amzn.to

先日のセール、

denpa-shinbun.com

に引き続き、技術書が半額セール中。

今回はなんだかマイナー本や、個人出版に近そうなタイトルが多い印象。

機械学習のDeepLearning周りの本がいくつかある、TensorFlowの本もあるが、内容は薄そうに見えなくもない。

気になる本