初投稿です。
foreverを使う選択肢もありますがsystemdでやります。
目的
gitで自動デプロイしているNodeサーバーがあり、それをデプロイ後に自動で再起動させたい。
方法
- systemdでサーバーをデーモン化
- systemd.pathを使ってファイル監視して更新されたら再起動
デーモン化
まずサーバーのデーモン化
[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
を起動してくれる。
が、ここにハマりポイントがあった。
[Unit]
Description=hogehoge
[Path]
PathChanged=/{サーバーまでのパス}/server.js
[Install]
WantedBy=multi-user.target
これを有効化、起動した。これでmy_server.service
が再起動すると思ったのだが、server.js
をいくら変更しても反映されない。
調べたところ、ファイルの変更に反応して「起動」するのであって「再起動する」のではなく、my_server.service
は既にactiveなので起動できず反映されていない模様。
解決策
再起動を行うサービスを別で用意する。
[Unit]
Description=hogehoge
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart my_server.service
[Install]
WantedBy=multi-user.target
このサービスが起動するとmy_server.service
を再起動してくれる。あとはこれをファイル監視で起動させる。
[Unit]
Description=hogehoge
[Path]
PathChanged=/{サーバーまでのパス}/server.js
[Install]
WantedBy=multi-user.target
同様にシンボリックリンクの作成、有効化、起動を行う。
結論
反映された。
感想
実用にはここにログの設定などをするべきなのだと思います。
理解が浅いのでまさかりお待ちしています。
参考