2023 年度 OSS リテラシ 3 : センサーの運用開始

cron の設定

ファイル名は自分の環境に合わせること! 以下の資料のファイル名 sensor.py は自分の作成したプログラムのファイル名で置き換えてください.

ラズパイが起動したときにセンサーのスクリプト (sensor.py) が自動的に実行するようにする.

また,ラズパイを長期間運用していると, ネットワークが切れることがある. そこで, 以下のような 1 分おきにネットワークの導通を確認し, 問題があれば ラズパイを再起動するプログラムをバックグラウンドで動かすことにする.

上記の 2 つのプログラムを再起動した時に自動的に起動するように crontab に登録する. 起動直後に動かすと wlan0 が落ちっぱなしになることがあるので, sleep で 2 分ほど経ってから動かすようにしている.

なお,sensor.py は自分のホームディレクトリに置かれていることを前提としていることに注意されたい.

$ cd

$ ls -l sensor.py

   sensor.py が存在することを確認.

$ crontab -e

  Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano      
  2. /usr/bin/vim.tiny          <-- vim 選択を推奨
  3. /usr/bin/emacs
  4. /bin/ed
  ...(略)...

  (末尾に追加)
  @reboot  sleep 120; python sensor.py

wifi-reset.rb は wget で取得してほしい. それを root の crontab に登録する. また,センサー Si7021 を使うには pigpiod を root 権限で予め実行しておく必要があるので,それも追加しておく.

$ sudo -s

# cd /root

# wget https://www.gfd-dennou.org/arch/iotex/oss/IoTeX_2023/wifi-reset.rb

# crontab -e

  Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano      
  2. /usr/bin/vim.tiny          <-- vim 選択を推奨
  3. /usr/bin/emacs
  4. /bin/ed
  ...(略)...

  (末尾に追加)
  @reboot  sleep 90;  pigpiod
  @reboot  sleep 150; ruby /root/wifi-reset.rb

試しに wifi-reset.rb を実行すると以下のようになる. 変数 s の末尾に exit code が表示されるので,その数字が 0 でない場合には再起動をかけている.

# cat wifi-reset.rb

  require 'open3'

  #初期化
  count = 0

  #無限ループ
  loop do
     # ネットワークの導通をチェック. 学内のサーバに ping を打つ.
     o, e, s = Open3.capture3("ping -c 2 10.0.0.7")
     p "o: #{o}"
     p "e: #{e}"
     p "s: #{s}"
     mes = s.to_s.split(" ")
     num = mes.pop.to_i #最後の数字を取り出す
     p "num: #{num}"
     p "count: #{count}"

     # "exit 0" (正常終了) か,それ以外かを判断.
     # 正常終了した場合には回数をリセット
     if num == 0
        count = 0
     else
        count += 1
     end

     # 5 分ネットワークが止まっていたら再起動
     if count > 5
        system("/usr/sbin/reboot")
        break
     end

     # 1 分待つ
     sleep 60
   end

# ruby wifi-reset.rb

   "o: PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.\n64 bytes from 10.0.0.7: icmp_seq=1 ttl=61 time=0.400 ms\n64 bytes from 10.0.0.7: icmp_seq=2 ttl=61 time=0.458 ms\n\n--- 10.0.0.7 ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 1078ms\nrtt min/avg/max/mdev = 0.400/0.429/0.458/0.029 ms\n"
   "e: "
   "s: pid 32519 exit 0"

試しにネットワークケーブルを抜いたり,wifi を止めた後に,作成したコマンドを実行する. 5 分程度経過した後にラズパイが再起動すれば正しく動作していることになる. なお,wifi-reset.rb の動作確認後に,wifi を再開させておくこと.

動作確認

ラズパイを再起動した後に,以下を確認すること.

  • 自分の grafana のダッシュボードにデータが表示されていることを確認すること.
  • SSH でログインして,動作中のプロセスを確認すること.

なお,プロセスが動いているか確認するには以下のようなコマンドを実行すれば良い.

$ ps aux | grep wifi-reset.rb
$ ps aux | grep sensor.py

SSH で接続するためには

SSH で接続するためには,自分のラズパイの IP を把握する必要がある. ラズパイの IP を調べるためには,grafana の画面を右カラムのホスト名・IP・時刻のテーブルを参照すること.

<URL:http://grafana.matsue-ct.jp:3000/d/b9fc40a7-b54e-41d1-86c8-07f57c4925c1/2023-oss3?orgId=1&from=now-15m&to=now>

デスクトップ環境の利用停止

ラズパイで観測を始めた後は, ラズパイのデスクトップ環境は必要なくなる. 必要のないプロセスを動かすして OS の負荷を上げることは適当ではないので, デスクトップ環境を止めることにする. デスクトップは lightdm が管理しているので, それを使わない設定を行えば良い.

$ sudo -s 

# systemctl disable lightdm

# systemctl stop lightdm

再起動後に再度ラズパイに接続して, ps aux コマンドを実行すると, 起動しているプロセスの数が減っていることに気づくだろう.

# ps aux

課題

  • crontab の使い方を調べなさい.
    • 5 分毎にコマンドを実行するためには?
    • 毎日 13:00 にコマンドを実行するためには?