ネットワークの疎通確認に使用する ping コマンドを利用して、どの時間帯にどのくらいの時間外出していたか履歴を作成します。
具体的には自宅の無線LANにおけるスマホのIPアドレスに対して毎分 ping を放ちます。その後、 echo $? で返り値を確認すればスマホがネットワークに参加している場合は「0」、そうでない時は「1」となります。従って「0」の場合は在宅、「1」の場合は外出中と判断してデータベースに登録するようにしました。
#crontab の一部 PATH=/usr/local/gmt5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) # | | | | | * * * * * welcome_back.sh
繰り返し実行は上記のように crontab へ登録することにより可能となります。
# welcome_back.sh の中身
#!/bin/bash mobile_IP=xxx.xxx.xxx.xxx # テーブルが存在しなければ作成する mysql life_log << _SQL_ create table if not exists athome ( time datetime, home boolean ); _SQL_ # 0.25秒間隔タイムアウト0.1秒のピンを10回打つ ping -c 10 -i 0.25 -w 0.1 ${mobile_IP} > /dev/null 2>&1 exist=`echo $?` if [ ${exist} -eq 0 ] then printf "%s %s 在宅\n" `date +'%F %T'` else printf "%s %s 外出\n" `date +'%F %T'` fi mysql life_log << _SQL_ insert into athome(time,home) value(now(),!"${exist}"); /* delete from athome where time <= NOW() - INTERVAL 7 day; */ _SQL_
上記のスクリプト中では秘匿していますが、シェル変数 ${mobile_IP} がスマホのIPアドレスということになります。arp-scan で調べるなどして正しい値を入れて下さい。データベースの容量が余り大きくなりすぎても嫌なので、一週間以上前の履歴は消去するように計画していますが、現時点ではコメントアウトしてあります。