3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BunAdvent Calendar 2023

Day 16

BunアプリをPM2で動かしてデーモン化する

Last updated at Posted at 2023-11-30

追記: 2023/12/16 Bunでpm2をインストールして動かす方法について記事のへ追記しました

この記事で「pm2をインストール」する方法をpm2本家にふってしまっていたので「Bunでpm2をインストールして動かす」方法を追記しました。

やはり、bun install は速くて気持ちが良いっす。

ーー

実行しているプログラムを、ユーザーがログアウトしたり、シェルセッションを閉じてもプロセスを続行したいとか、アプリケーションがクラッシュしても自動的に再起動したいなどという需要は結構あります。

そんな場合に Node.js で良く使われるのは、デーモン・プロセス・マネージャーPM2 です。

PM2は、複数のプロセスを一覧管理し、その log や error log などをリアルタイムに監視もできるなどの豊富な機能を持つ優れたツールです。

image.png

PM2 に Bun アプリを登録する

さて、今回はその PM2 に Bun アプリを登録しようという企画になります。

例えば先日書いた「BunでWebSocketのデータ配信サーバーを建ててccchartにリアルタイム表示する」という記事の WebSocket サーバーは、サーバーが止まると当然チャート表示も止まってしまいます。つまり、常時動いて配信を続けていて欲しいサーバーです。

動作サンプルURL
https://ccchart.com/bun/ws-8116.html
動画

まぁ、この WebSocketサーバーに限らず、 Webサーバーでもチャットサーバーでも普通のアプリでもそういうものはたくさんありますよね。

ここでは PM2 のインストールなどのドキュメントは、PM2の本家 (https://pm2.keymetrics.io/docs/usage/quick-start/)  を参照していただくとして、どう登録したら良いのかについて書いていきます。

PM2 で Bun サーバーをどう動かすか

PM2 はアプリをこんなふうに登録します。

PM2へapp.jsを登録する
$ pm2 start app.js

※注意 2023/12/16 : 記事下の追記を参照してください。「npm install pm2 -g」ではなく「bun install pm2 -g」などでインストールする場合は「pm2 start app.js」ではなく「bun pm2 start app.js」といった構文になります。

これで app.js が PM2へ登録できてデーモン化し、クラッシュしても自動的に再起動され、様々なPM2の機能が使えるようになります。

そして、Node.js 以外の他の言語でも以下のような感じで登録できます。

PM2へapp.pyなどを登録する
$ pm2 start app.py # python
$ pm2 start app.sh # シェルスクリプト

でも注意してみてください。

これって 拡張子 .js、.py、.sh などで登録されています。拡張子と言語の関連付けがなされていれば特に問題は無いのですが、

「.js」や「.ts」などの場合はどうでしょうか?

現在のサーバー側は、一般的には Node.js がインストールされているケースが多いでしょう。そうすると、「pm2 start app.js」と書いた時には、 Node.js アプリだと判断される可能性が高くなります。

つまり、それでは Bun アプリの明示的な登録ができないのです。

でもまぁ、いろいろな登録方法がありますが、ここでは2つの方法を書いておきます。

Bun パスからの起動を登録する

PM2は、「pm2 start "コマンド"」と書いて登録することができるので、次のように Bun へのパス+アプリパス を書くことで app.js を Bun アプリとして起動することができます。

PM2へBunのパスからのapp.js起動を登録する
$ pm2 start "~/.bun/bin/bun app.js"

シェルコマンドに記述してから登録する

上でシェルスクリプトの起動例「pm2 start app.sh」を書いたので既にお分かりかと思いますが、シェルスクリプトへ Bun による app.js の起動を書いてから PM2 へその .sh を登録する手もあります。

たとえば、こんな感じですね。

app.sh シェルスクリプトでBunのパスからのapp.js起動を登録する
#!/usr/bin/sh
~/.bun/bin/bun ./app.js

この app.sh をPM2へ登録します。

app.sh をPM2へ登録する
$ pm2 start app.sh # Bun アプリを起動するシェルスクリプト

これで、BunもめでたくPM2で管理できるようになります。

追記: Bunでpm2をインストールして動かす

上の記事では、pm2のインストールを本家にふって話を勧めたので、npm i pm2 なインストールを前提にしています。

でも bunでも入れられるはずやろ。ということでやってみました。

Bunでpm2を入れる
bun i pm2 -g

これで、インストールできるのですが、このまま「pm2 -v」や「pm2 start app.js」のような記述では動きませんでした。

Bunでpm2を動かす
$ pm2 -v

Command 'pm2' not found, did you mean: 

見つからないと言われます。
そこで、bun を頭に書いてこうしてみると

Bunでpm2を動かす
$ bun pm2 -v
5.3.0

動きました。
したがって、「pm2 start app.js」ではなく、一応上記の通り、このように書けば、

$ bun pm2 start "~/.bun/bin/bun app.js"

登録できました!
image.png

というわけで、この場合、上の記事で書いた「pm2 start app.js」といった記述は「bun pm2 start "~/.bun/bin/bun app.js"」等と読み替えてください。

しまりがなくてすみません。

でも、もちろん、pm2インストール速度は超速いす。

$ bun i pm2 -g
bun add v1.0.18 (36c316a2)

 installed pm2@5.3.0 with binaries:
  - pm2
  - pm2-dev
  - pm2-docker
  - pm2-runtime

[13.00ms] done

最近 Qiita に書いた Bun 関連の記事10選

3
0
0

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?