はじめに
大学院修了時に友人から初代Raspberry Piを戴いたので色々遊んでいました。
初代のRaspberry Piはスペックが大したものではないですが、bot作ったりして遊ぶ分には便利です。
大したことはしてないのですが、備忘代わりのTips集を書きます。
Raspberry Piをいじっていると、Linux環境での各種セットアップ方法とかサーバ構築技術が身についたりするので個人的にはオススメです。
Tips集
見当たらないとき向けにarpで探す
Raspberry Piを探すのはめんどくさいので、ethernetでつながった状態でIPアドレスを探します。
kmori@edelweiss ~/Desktop $ arp -a
これをラズパイを繋ぐ前と後で差分を取ればIPアドレスがわかります。
pi@raspberrypi:~ $ sudo vim /etc/dhcpcd.conf
一番下に挿入(下記は無線LANを使う前提)
interface wlan0
static ip_address=192.168.0.xxx/24
static routers=192.168.0.xxx
static domain_name_servers=192.168.0.xxx
static ip_addressに固定化したIPアドレスを設定します。
static routersとstatic domain_name_serversはルータのIPアドレスを設定(ブリッジしてる場合はそっちのIPアドレスを設定)します。
Watchdogの導入
エラー時にリブートしてくれる番犬こと、Watchdogを設定します。
私の環境だとうまくいかなったパターン
pi@raspberrypi:~ $ sudo apt install watchdog
pi@raspberrypi:~ $ sudo vim /lib/systemd/system/watchdog.service
最下部のinstallの設定を変えます。
この変更では、複数ユーザ環境がベースとなるターゲットへ指定しており、多くのサービスのターゲットがこのターゲットに紐付いています。
[Install]
WantedBy=multi-user.target
Watchdogの自動起動を設定します。
pi@raspberrypi:~ $ sudo update-rc.d watchdog enable
モジュールをロードの上、設定変更を実施します。
pi@raspberrypi:~ $ sudo modprobe bcm2835_wdt
pi@raspberrypi:~ $ sudo vim /etc/watchdog.conf
下記のように一部コメントアウトを外した上、タイムアウトを設定して有効化します。
max-load-1 = 24
(中略)
watchdog-device = /dev/watchdog
リブートします。
pi@raspberrypi:~ $ sudo reboot
最後にfork bombで動作確認をします。
pi@raspberrypi:~ $ :(){ :|:& };:
ってやってもうまくいかなかった・・・。
リトライ
調べたところ、標準の機能でいけるみたいなので、更にいじります。
pi@raspberrypi:~ $ sudo vim /boot/config.txt
で一番下に
dtparam=watchdog=on
を追記します。更に、
pi@raspberrypi:~ $ sudo vim /etc/modprobe.d/bcm2835-wdt.conf
で作成を行い、この1行を挿入します。
options bcm2835_wdt heartbeat=15 nowayout=0
これで15秒間隔でwatchdogがheartbeatを期待する設定になりました。
さらにシステム側で heartbeat信号を出力する設定をします。
pi@raspberrypi:~ $ sudo vim /etc/systemd/system.conf
で開いて、
RuntimeWatchdogSec=10
とします。これで10秒以内の間隔でheartbeatが行われます。この状態で再起動。
pi@raspberrypi:~ $ dmesg | grep bcm2835-wdt
[ 0.764255] bcm2835-wdt 20100000.watchdog: Broadcom BCM2835 watchdog timer
無事に起動を確認。
最後のfork bombを打ち込んで無事に動くことを確認します。なんだかんだで長い道のりです。
自動再起動
当然ながらRaspberry PiもPCなので、稼働し続けていると調子が悪くなります。
例えば、走らせているスクリプトが落ちる上、SSHしても繋がらなかったり・・・。
ということで、再起動する設定をします。おなじみにcronでやります。
pi@raspberrypi:~ $ sudo crontab -e
で設定可能ですが、何も設定していない状態だと下記のようにでます。
pi@raspberrypi:~ $ sudo crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
なので、下記の指定をしてcrontabをインストールしてあげましょう。
Choose 1-4 [2]: 3
crontab: installing new crontab
Vimが出てきたら、一番下にこれを挿入してあげましょう。
00 3 * * * /sbin/reboot
cronの設定方法は説明書きに以下のように書いています。
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
つまり、 "分 時 日 月 曜日 コマンド" で可能です。
設定が完了したら、crontabを確認しましょう。
pi@raspberrypi:~ $ sudo crontab -l
作成したscriptをservice化
service化して起動時から動かします。
$ sudo vim /etc/systemd/system/runMybots.service
[Unit]
Description = Running My bots
[Service]
ExecStart = /home/pi/program/start.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
start.shの中身は以下に設定。
python3 /home/pi/program/reboot.py
python3 /home/pi/program/runbot01.py
reboot.pyでリブートした旨をSlackに通知しています。
先程追加したrumMybotsがリストにいるか確認。
$ sudo systemctl list-unit-files --type=service | grep runMybots
いることをみつけたら、自動起動にします。
$ sudo systemctl enable runMybots.service
最後に起動します。
$ sudo systemctl start runMybots.service
これで途中で落ちても大丈夫です。
温度&湿度自動投稿
学生時代に住んでいた部屋はユニットバスだったためか、湿度が異様に高く、窓にカビがすぐはえてしまっていたので、湿度への警戒心が高くなりました。
そのため、部屋の温度と湿度のセンサをSlackへ投稿するbotを作っていました。
なお、このbotはセンサが壊れたため現在は動いていません。
人感センサ
赤外線センサによる、人感センサのbotを動かしていました。
大した金品はないのですが、警備会社の装置みたいなものを作られるのでは・・・?と考えたのがきっかけです。
電車運行情報
Webページを定期的にクローリングして、遅れていたらSlackに投稿するbotです。
私が普段利用している、東京メトロ東西線は混雑で遅れることが多いため便利でした。
現在は、Alexaのレシピが優秀で勝手に教えてくれるのでやめました。
各Scriptについては需要があれば書きます。
参照したサイト
Raspberry Pi 3B+を定期的に再起動する方法(cron) | あとをしNOTE
Raspberry PiにハードウェアWatchdogを設定してみましょう | CANDY LINE Blog
Raspberry piでslackbotを動かす - Qiita