中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【Linux】Node.jsをSystemdに登録しデーモン化する

1.概要

自作アプリケーションをデーモン(サービス)に登録(常駐化)する方法なります。



まずは簡単にLinuxの起動は下記の順番で行われます。

①BIOS/UEFI
 マザーボード上のROMに搭載されているプログラム。ハードウェアの管理、制御を行う。
②ブートローダー
 コンピューター起動時に実行されるOSを読み出すプログラム
③Kernel
 OSの中核的なプログラム。ハードウェアとの架け橋的な存在
④Systemd
 Linuxのシステム管理を行う。デーモン(サービス)管理も。


今回は【AmazonLinux2】 + 【node.js】でsystemdに登録してみました。
サービス名は【testapp】、実行ユーザーは【testuser】としています。


2.ユニットファイル作成する

【/etc/systemd/system】にユニットファイルを定義することでサービス化されます。
ここはユーザーが独自で設定する場所で、管理者によって管理されます。

ファイル名は【testapp.service】とすることでサービスユニットと認識されます。

下記に設定ファイルのサンプルを作成してみます。
【Unit】【Service】【Install】の3つのセクションに分かれており、
必要事項を設定します。
今回使用していない項目もありますので、詳しくはこちらを参照ください。
access.redhat.com

	[Unit]
	Description= Node.js testapp
	
	[Service]
	Type=simple
	User=testuser
	WorkingDirectory=/home/testapp/backend
	ExecStart=/home/tnvclient/.nvm/versions/node/v12.13.0/bin/node /home/testapp/backend/app.js
	ExecStop=/usr/bin/pkill -e node
	Restart=always
	RestartSec=2
	StandardOutput=syslog
	StandardError=syslog
	SyslogIdentifier=testapp
	
	[Install]
	WantedBy=multi-user.target

3.設定内容の解説

Description:コマンド【systemctl status testapp】で表示されます。ユニットの説明になります。
Type:simple:基本単体で動作するものはこれでOK。(デフォルト値)
User:実行するユーザーを指定します。
WorkingDirectory:node.js等ライブラリがある場合などに設定します。
ExecStart:ユニットの開始時に実行するコマンドまたはスクリプトを指定します。
ExecStop:ユニットの停止時に実行するコマンドまたはスクリプトを指定します。
Restart:プロセスが終了したら、再起動する
RestartSec:サービスを再起動するまでの時間(秒)


4.ログの出力

ログに関する設定は下記の3項目になります。

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=testapp

これでSyslogにログが出力されます。



ログの確認方法方ですが

>journalctl -u testapp| grep -E 'Sep 21'

といった感じで確認ができます。
※9/21のログでグレップしています。


5.デーモン(サービス)への登録

※作業はroot権限で行います。

・ユニットファイル作成

> vi /etc/systemd/system/testapp.service

viコマンドでテキストエディタを起動し、2項の内容を記述します。

・サービス一覧にファイルが存在するか確認

> systemctl list-unit-files --type=service | grep testapp
testapp.service                           disabled

ユニットファイルが作成できていれば、ここに表示されます。

・状態の確認

> systemctl status testapp.service
● testapp.service - Node.js testapp
   Loaded: loaded (/etc/systemd/system/testapp.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

この状態ではまだ動作していません。

・開始

> systemctl start testapp.service

・再度状態の確認

> systemctl status testapp.service
 testapp.service - Node.js testapp
   Loaded: loaded (/etc/systemd/system/testapp.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-09-22 09:33:50 JST; 29s ago
 Main PID: 21443 (node)
   CGroup: /system.slice/testapp.service
           mq21443 /home/tnvclient/.nvm/versions/node/v12.13.0/bin/node /home/testapp/backend/app.js

Sep 22 09:33:50 ip-172-17-20-36.ap-northeast-1.compute.internal systemd[1]: Started Node.js testapp.

これで問題なく動作していることが確認できました。
ユニットファイルに間違いがある場合は動作しませんので、ユニットファイルの確認が必要になります。

・自動起動ON

> systemctl enable testapp.service
Created symlink from /etc/systemd/system/multi-user.target.wants/testapp.service to /etc/systemd/system/testapp.service.


以上でデーモン(サービス)への登録は完了になります。


6.その他コマンド

・停止

> systemctl stop testapp.service

・自動起動OFF

> systemctl disable testapp.service