linuxにおいて、systemdを用いたデーモン化を試してみる。
デーモンって何?
demon(悪魔)じゃなくてdaemon(神霊)らしい。
daemon(守護神)とはギリシャ神話に登場し、神々が煩わされたくないと考えた雑事を処理した存在である。同様にコンピュータのデーモンもユーザーが煩わされたくないタスクをバックグラウンドで実行する[3]。
Linux系においてバックグラウンドで常駐で働くプログラムのこと。
特にLinuxの起動処理やシステム管理を行う仕組みがsystemd
。これをsystemctl
コマンドで管理する。
テスト用のプログラム
毎秒hello worldするだけ。これを動かしてみよう。
setInterval(() => { console.log("hello, world!"); }, 1000);
これをhome/[ユーザー名]/test/testApp.js
と配置しておく。
nodeサーバーを動かしたいのが実用上での目的なので、これをnodeで実行していく。
Unit 定義ファイルを書く
ユニット定義ファイル、test.service
を以下のように書き、etc/systemd/system/
下に配置する。
[Unit]
Description=(任意の説明文)
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/bin/node /home/[ユーザー名]/test/testApp.js
WorkingDirectory=/home/[ユーザー名]/test
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
この時ExecStart
には
ExecStart=nodejs本体のパス(/usr/bin/node) 動かしたいnode.js用のファイル
WorkingDirectory
には
WorkingDirectory=作業用ディレクトリ
を入れておく。
動かしてみよう
enableで自動起動有効化
sudo systemctl enable test.service
startでサービス起動。
sudo systemctl start test.service
このままではコンソール出力がされていないので、statusで状態を確認してみる。
systemctl status test.service
以下のような出力が得られた。毎秒hello worldしていることが確認できる。
May 26 23:12:01 instance-1 node[28439]: hello, world!
May 26 23:12:02 instance-1 node[28439]: hello, world!
May 26 23:12:03 instance-1 node[28439]: hello, world!
May 26 23:12:04 instance-1 node[28439]: hello, world!
May 26 23:12:05 instance-1 node[28439]: hello, world!
May 26 23:12:06 instance-1 node[28439]: hello, world!
May 26 23:12:07 instance-1 node[28439]: hello, world!
May 26 23:12:08 instance-1 node[28439]: hello, world!
May 26 23:12:09 instance-1 node[28439]: hello, world!
stopでサービス停止、disableで自動起動無効化ができる。
sudo systemctl stop test.service
sudo systemctl disable test.service
これで簡単なプログラムのデーモン化ができた。