はじめに
Node.jsのプログラムをsystemdに登録してデーモン化した際、いくつか躓いた点があったので備忘録として残しておきます。
開発・実行環境
以下の環境で実行しています。
- OS: Ubuntu 22.04.3 LTS
- Node.jsバージョン管理: volta
パッケージマネージャーとしてyarnを使用しており、Node.js, yarnともにvoltaで管理しています。
プロジェクトパス
ユーザー名を user1
とし、/home/user1/nodejs-app
にプロジェクトがあると仮定します。
実行について
上記のプロジェクトルートにある start.sh
というシェルスクリプトで起動することを前提とします。
以下のようなファイルです。
PATH=$PATH:$HOME/.volta/bin
yarn install
nohup yarn run start &
ここでPATHを通す必要があります。
これがないとsystemdでの実行の際、yarn
コマンドが見つからずエラーを吐いてしまうので、忘れないようにしましょう。
また、chmod u+x start.sh
で実行権限を与えてください。
systemdへの登録
/etc/systemd/system/
に <name>.service
ファイルを作成します。
今回は nodejs-app.service
とします。
cd /etc/systemd/system/
touch nodejs-app.service
nodejs-app.service
は以下のように記述します。
ネットワークを使用するため、network-online.target
を設定しています。
[Unit]
Description=Node.js App
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/bin/bash /home/user1/nodejs-app/start.sh
User=user1
WorkingDirectory=/home/user1/nodejs-app
Restart=always
Type=forking
[Install]
WantedBy=multi-user.target
設定を更新し、systemdに設定を反映させます。
nano nodejs-app.service
systemctl daemon-reload
試しに起動してみましょう。
systemctl start nodejs-app.service
正常に起動できているかどうかはstatusで確認できます。
systemctl status nodejs-app.service
Active: active (running)
となっていればOKです。
各種コマンド
ログを確認したい場合は journalctl
コマンドを使用します。
journalctl -u nodejs-app.service | less
エラーを吐くなどし、サービスを止めたい場合はstopコマンドを使いましょう。
systemctl stop nodejs-app.service
サービスの自動起動を有効にする
ここまで問題なければサービスの自動起動を有効にします。
正常に起動できていない場合は、ログを確認して修正してください。
systemctl enable nodejs-app.service
有効になっているかは以下で確認できます。
systemctl is-enabled nodejs-app.service
最後に再起動し、起動が確認できたら完了です!
reboot
systemctl status nodejs-app.service