前回(第7回) までで、アプリの機能はひととおり揃いました。でも dotnet run を手で叩いている限り、SSHを切ると止まり、再起動でも立ち上がりません。今回は systemd で常駐化し、電源を入れれば自動で立ち上がる24時間モニタリング機にします。
Table of contents
Open Table of contents
方針
- アプリを publish(配布用にビルド)して固定の場所に置く
- systemdサービスとして登録し、自動起動・自動再起動させる
STEP 1:publish する
第2回で .NET を入れているので、framework-dependent(.NETランタイム利用)で発行します。
cd ~/TempMonitor
dotnet publish -c Release -o ~/tempmonitor
💡 自己完結(self-contained)にすると .NET のパス依存が消えて配布が楽です:
dotnet publish -c Release -r linux-arm64 --self-contained -o ~/tempmonitorこの場合、実行ファイルに実行権限を付けます:chmod +x ~/tempmonitor/TempMonitor
STEP 2:systemd ユニットを作る
/etc/systemd/system/tempmonitor.service を作成します。
以下の内容のファイルを作ります。
[Unit]
Description=Temp Monitor (Blazor)
After=network.target mosquitto.service
[Service]
WorkingDirectory=/home/pi/tempmonitor
ExecStart=/home/pi/.dotnet/dotnet /home/pi/tempmonitor/TempMonitor.dll
Restart=always
RestartSec=5
User=pi
Environment=DOTNET_ROOT=/home/pi/.dotnet
Environment=ASPNETCORE_URLS=http://0.0.0.0:5000
Environment=DOTNET_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
ポイント:
Restart=always+RestartSec=5:落ちても5秒後に自動復帰User=pi:GPIO/SPIを使うため、gpio・spiグループに属するユーザーで動かす(既定のpiは通常所属)ASPNETCORE_URLS:全インターフェースで待ち受け(第2回と同じ)- 自己完結で発行した場合は
ExecStart=/home/pi/tempmonitor/TempMonitor(dotnetのパス・DOTNET_ROOTは不要) - MQTT(第7回)を使うので
After=...mosquitto.serviceを付けると起動順が安定
STEP 3:有効化して起動
sudo systemctl daemon-reload
sudo systemctl enable --now tempmonitor
enable:次回起動時にも自動で立ち上がる--now:今すぐ起動
状態とログを確認します。
systemctl status tempmonitor
journalctl -u tempmonitor -f # ログをリアルタイム表示
http://<PiのIP>:5000 が、SSHを切っても・再起動しても表示されれば成功です。
更新するとき
コードを直したら、再publishしてサービスを再起動します。
dotnet publish -c Release -o ~/tempmonitor
sudo systemctl restart tempmonitor
(この更新を自動化するのが次回のGitHub Actionsです)
つまずきポイント
- 起動直後に落ちる(status=failed):
journalctl -u tempmonitor -eでスタックトレースを確認。多くはDOTNET_ROOT/パス、権限、ポート競合 - GPIO/SPIで権限エラー:
User=のユーザーがgpio・spiグループにいるか(groups piで確認) - 80番で公開したい:1024未満のポートは特権が必要。
ASPNETCORE_URLSは5000のままにし、必要なら nginxのリバースプロキシを前段に置く(外部公開は第10回で扱います)
まとめ
- publish → systemdユニット →
enable --nowで常駐化 Restart=alwaysで自動復帰、enableで起動時に自動立ち上げ- ログは
journalctl -u <サービス名> - GPIO/SPIを使うので、実行ユーザーのグループ所属に注意
次回(第9回)は、GitHub Actions → Piへ自動デプロイ。pushしたら自動でpublish&サービス再起動されるようにします。
