前回

だいぶ日が空いてしまいましたが・・・

前回は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

以上😋