3
1

More than 1 year has passed since last update.

Nodejsサーバーのファイル監視と自動再起動

Last updated at Posted at 2022-03-07

初投稿です。
foreverを使う選択肢もありますがsystemdでやります。

目的

gitで自動デプロイしているNodeサーバーがあり、それをデプロイ後に自動で再起動させたい。

方法

  • systemdでサーバーをデーモン化
  • systemd.pathを使ってファイル監視して更新されたら再起動

デーモン化

まずサーバーのデーモン化

/home/user_name/systemd/my_server.service
[Unit]
Description=hogehoge

[Service]
User=user_name
WorkingDirectory=/{サーバーまでのパス}/
ExecStart=/{nodeのパス}/node server.js
Restart=always

[Install]
WantedBy=multi-user.target

シンボリックリンクをsystemdのディレクトリに作成しサービスを有効化、起動

ln -s /home/user_name/systemd/my_server.service /etc/systemd/system/my_server.service
systemctl enable my_service.service
systemctl restart my_service.service

ファイルは/etc/systemd/system/に直接置いても良いが、root権限をあまり使いたくないため今回はホームに置いた。

これでNodejsサーバーはデーモン化され、止まっても自動再起動するようになった。
次はserver.jsを監視して自動再起動するように設定する。

ファイルの監視

ファイルの監視は{サービス名}.pathで行うことが出来る。指定したpathに変更があれば{サービス名}.serviceを起動してくれる。
が、ここにハマりポイントがあった。

my_server.path
[Unit]
Description=hogehoge

[Path]
PathChanged=/{サーバーまでのパス}/server.js

[Install]
WantedBy=multi-user.target

これを有効化、起動した。これでmy_server.serviceが再起動すると思ったのだが、server.jsをいくら変更しても反映されない。
調べたところ、ファイルの変更に反応して「起動」するのであって「再起動する」のではなく、my_server.serviceは既にactiveなので起動できず反映されていない模様。

解決策

再起動を行うサービスを別で用意する。

/home/user_name/systemd/my_server-watcher.service
[Unit]
Description=hogehoge

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart my_server.service

[Install]
WantedBy=multi-user.target

このサービスが起動するとmy_server.serviceを再起動してくれる。あとはこれをファイル監視で起動させる。

/home/user_name/systemd/my_server-watcher.path
[Unit]
Description=hogehoge

[Path]
PathChanged=/{サーバーまでのパス}/server.js

[Install]
WantedBy=multi-user.target

同様にシンボリックリンクの作成、有効化、起動を行う。

結論

反映された。

感想

実用にはここにログの設定などをするべきなのだと思います。
理解が浅いのでまさかりお待ちしています。

参考

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1