◆ pm2 や forever を通さず systemd で管理
◆ OS 起動時の起動とプロセス終了時の再起動

これまでは Node.js アプリケーションのサービス化に pm2 や forever を使っていましたが どっちも不満があるもので次も使いたいかというとそうでもないです
かと言って 他に良いものがないか探していてもこれまでどおりで特に新しそうなものもありません

pm2 や forever は Node.js プロセスが終了したときに再起動するのが目的で OS 起動時の自動起動は systemd から pm2 や forever を起動していました
考えてみると systemd だけで十分で forever などはなくてもいいんじゃないのと思いました

方法は nodesource のブログにあるような感じです
https://nodesource.com/blog/running-your-node-js-app-with-systemd-part-1

ExecStart のところに pm2 や forever の代わりに 直接サービス化したいプロセスを起動するコマンドを書きます

ExecStart=/usr/bin/node /path/to/web-server.js

pm2 や forever のときとは違って 停止のときは起動したプロセスを単にプロセスを止めれば良いので ExecStop はいらないです

これだけでは起動するだけで 再起動はしてくれません
再起動させるために Restart を指定します

Restart=always

再起動条件は nodesource の方では on-failure ですが Node.js 内の処理から正常終了が存在しない 常駐するものなら always でいいと思います
特に Node.js の場合は Promise のエラーをハンドルしない Unhandled promise rejection での終了は終了コードが 0 になり 正常終了扱いになる問題があります

また Restart を使う場合は 構文エラーや通信エラーなど起動直後にエラーで終了したときに無限に再起動されても困ります
pm2 や forever はその辺りは考慮されていたので systemd もなにかあるかと探してみると

StartLimitBurst と StartLimitIntervalSec がありました
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#StartLimitIntervalSec=interval

[Service] セクションではなく [Unit] セクションです
Restart に限らず StartLimitIntervalSec の間に StartLimitBurst 回以上の実行が許可されないというものです
高速で再起動するとこれに引っかかるので無限再起動を防げます

デフォルトは 10 秒間に 5 回という設定になっています
デフォルトでもいい感じの設定になっているのでここは触れなくても大丈夫そうです

ところでこのデフォルト値はドキュメントには載っていなかったのですが systemctl show コマンドで見れます

systemctl show my-service

こうすれば my-service の設定一覧が見れます
実際に使われる設定が見れるので 設定ファイルに書いてない部分はデフォルト値が入ってます

StartLimit のあたりはこういう感じでした

...
Perpetual=no
StartLimitIntervalUSec=10s
StartLimitBurst=5
StartLimitAction=none
FailureAction=none
...