目次
はじめに
私はラズパイ+node.jsで自宅IoT環境を整備しています。
ですが先日OSをアップデートしたら永らく愛用していた
/etc/rc.local
#!/bin/sh -ecode:
#
# rc.local
(中略)
sudo -u myuser node XXXX.js
exit 0
でラズパイ起動時にnodeコマンドを自動実行する機能が使えなくなりました。
色々ググったら「そもそもrc.localで自動実行という考えが古い」てな感じだったので、諦めてsystemdでサービス化して自動実行するようにしました。
ちょっと面倒ですが仕方ないです。じゃあなrc.local!
環境
・Raspberry Pi 4 Model B Rev 1.1
▶Raspbian GNU/Linux 10 (buster)
▶Linux raspberrypi 5.10.103-v7l+ #1529 SMP Tue Mar 8 12:24:00 GMT 2022 armv7l GNU/Linux
やったこと
systemdのユニットファイル(サービスの中身を記述するファイル)作成
ユニットファイルの置き場所に移動する
cd /etc/systemd/system/
ユニットファイルを作る
今回は「restapi」というサービス名にしてみます。
sudo vi restapi.service ←{任意のサービス名}.serviceという形式のファイルを作成する
[Unit]
Description=ワシが作った ←ユニットの説明を入れる [Service]
User=myuser ←実行ユーザ名を入れる
WorkingDirectory=/home/myuser/mynodeapp ←実行ディレクトリを入れる
ExecStart=node mynodeapp1.js ←実行したいコマンドを入れる
[Install]
WantedBy=multi-user.target ←CLI環境で実行する為のおまじない(必須)
systemdのサービス有効化
以下のコマンドでサービスを有効化します。これで起動時に自動実行されるようになります。
sudo systemctl enable restapi.service
今すぐサービスを実行するには
sudo systemctl start restapi.service
サービスの状態を確認するには
sudo systemctl status restapi.service
※Active: active (running) なら実行されている。
サービスを無効化して停止するには
sudo systemctl disable restapi.service sudo systemctl stop restapi.service
ラズパイを再起動して確認
ラズパイを再起動してきちんとサービスが実行されているか確認します。
sudo reboot
起動してきたら…
sudo systemctl status restapi.service
※Active: active (running) なら実行されている。
ps -e | grep node
で確認しましょう。
rc.localの記述を削除
/etc/rc.local 内の自動実行の記述はもう使わないので行を削除しておきましょう。
万一また復活して二重で実行されたりしたら嫌ですし。