Raspberry PiでIoTなIT:スタートアップ時にsystemdを使ってnodeを自動起動させる
headlessで運用するRapsberry Piのシステムを開発中です。基幹となるサービスがnodeで動くので、システム起動時に自動的に起動するように設定してみました。RaspbianがWheesyまでのときはinsservでよかったのですが、Jessieからはsystemdに変わっています。insservでも起動できるのは確認しているのですが、折角ですのでsystemdでの起動に挑戦してみます。参考にしたのはこちら。Systemdを使ってさくっと自作コマンドをサービス化してみる – QiitaNode-RED.serviceまずserviceファイルを書きます。
pi@raspberrypi:~ $ sudo nano /etc/systemd/system/node-kt.servicerootで起動するのがセキュリティ的に望ましくないことは分かってはいるのですが、システムレベル、ハードウェアレベルにアクセスしないといけない関係上、やむを得ずrootにしています。
[Unit]Description=Node.js kawacchi timer serverAfter=syslog.target network.target[Service]ExecStart=/usr/local/bin/node /home/pi/kt/app.jsRestart=alwaysRestartSec=10 # Restart service after 10 seconds if node service crash$StandardOutput=syslog # Output to syslogStandardError=syslog # Output to syslogSyslogIdentifier=nodejs-ktUser=rootGroup=root[Install]WantedBy=multi-user.target保存したところ、systemctlコマンドで認識できました。
pi@raspberrypi:~ $ sudo systemctl list-unit-files --type=service | grep nodekmod-static-nodes.service static node-kt.service disabledsystemctlのstartからスタートでき、stopで停止できました。
pi@raspberrypi:~ $ sudo systemctl start node-ktpi@raspberrypi:~ $ ps -ax | grep node 1280 ? Ssl 0:02 /usr/local/bin/node /home/pi/kt/app.js 1342 pts/1 S+ 0:00 grep --color=auto nodepi@raspberrypi:~ $ sudo systemctl stop node-ktenableするとよく分かりませんがどこかに登録されたようです。
pi@raspberrypi:~ $ sudo systemctl enable node-ktCreated symlink from /etc/systemd/system/multi-user.target.wants/node-kt.service to /etc/systemd/system/node-kt.service.再起動したところ、プロセスが走っていました。外部からこのnodeへのアクセスも成功しています。
pi@raspberrypi:~ $ ps -ax | grep node 692 ? Ssl 0:03 /usr/local/bin/node /home/pi/kt/app.js 937 pts/0 R+ 0:00 grep --color=auto node以前のinitスクリプトを各方式よりも簡単でわかりやすいように感じました。serviceの記法も直感的でよいと思います。 “””
Unitファイルを再利用する場合
上記はJessieでの記録です。Unitはセクションと各設定を行ごとに分けて記述します。enable は[Install]に従って起動対象のリンクを作る操作で、その場で起動するstartとは別です。ファイルを変更したらsudo systemctl daemon-reloadで再読込みします。現在のログ出力はStandardOutput=journal・StandardError=journalを使えます。Node.jsの実体パスと実行ユーザーは、その環境で確認して指定します。