前回
だいぶ日が空いてしまいましたが・・・
前回はLINE NotifyのAPI制限を確認しました
今回 systemd で自動起動
ラズパイを起動してからプログラムを手動で実行するのは実用的じゃないですね
ですので、ラズパイ起動時にプログラムを自動起動します
自動起動には systemd を使います
こちらの記事を参照ください↓
systemd の良いところ
ちょっと本旨とずれますが、プログラムがエラーで停止しても、systemdがサービスを再起動してくれます
ラズパイ自体の再起動はcronでも良いですが、自作のプログラムはバグ取りが不十分なのでエラー停止でサービスを再起動してくれるのは助かります(エラー対策の話につながります)
エラー対策
今回はLINEに送信するため、ネットワークを利用します
実際動かしてみて、wi-fi関連処理がうまく行かずエラー停止が結構ありました
自分ではどうしようもない問題でした
また、USBが死ぬこともよくあり、これは再起動で復活しますので、定期再起動もサービスにしました
手動でプログラムを再実行できれば対策不要ですが、猫カメラは不在時に使用します
なので、手動で再実行はできず、エラー対策は必須です
私も猫カメラ開発でエラー対策が必要だと痛感しました (カメラ止まった!猫の様子がわからない!どうしよう!は飼い主には耐えられないです)
実装の候補は以下2つ
- Python中にリトライ処理をいれる
- systemdが勝手に再起動してくれる ← こっちにした
リトライ処理も実装してみましたが、よりお手軽な systemd にしました
.service の作成
猫カメラなので、名前はnyancam.service
にしました(何でもOKです)
ここでは/lib
以下に作っています(上の記事でもあるように、/etc
以下に作る方法もあります)
sudo nano /lib/systemd/system/nyancam.service
nyancam.service
の中身↓
[Unit]
Description = test
[Service]
ExecStart=/usr/bin/python3 /home/pi/Desktop/nyancam.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
ExecStart = XXX
はプログラムの起動についての記述です
/home/pi/Desktop/nyancam.py
をpython3で起動します
Restart=always
でnayncam.pyがエラー時にサービスを再起動してくれます
systemd コマンド
sudo systemctl start nyancam.service <--- サービスを起動するコマンド
sudo systemctl stop nyancam.service <--- サービスを停止するコマンド
sudo systemctl enable nyancam.service <--- サービスを自動起動するコマンド
sudo systemctl disable nyancam.service <--- サービスを自動停止するコマンド
start は起動(ラズパイを再起動したら停止してしまう)
enableは自動起動なのでラズパイが再起動してもnyancam.serviceを自動起動する
なので、 自動起動するには enable が必要
ラズパイの再起動用
再起動もsystemd を使っていることは上に書きましが、再起動用の .service と .timer も記載します
こちらも nyancam.service と同じように /lib
以下に作っています
sudo nano /lib/systemd/system/saikidou.service
[Unit]
Description = scheduled saikidou 4times per day 0 and 6 and 12 and 18
[Service]
Type = simple
ExecStart=/usr/bin/systemctl --force reboot
[Install]
WantedBy = multi-user.target
sudo nano /lib/systemd/system/saikidou.timer
1日に4回(0,6,12,18時)再起動するようにしています
[Unit]
Description = scheduled saikidou 4times per day 0 and 6 and 12 and 18
[Timer]
OnCalendar = *-*-* 0,6,12,18:00:00
AccuracySec = 1m
[Install]
WantedBy = timers.target
以上😋