Bun

指南生態系統

使用 systemd 以守護程序身分執行 Bun

systemd 是 Linux 作業系統的初始化系統和服務管理員,用於管理系統處理程序和服務的啟動和控制。

若要使用 systemd 以守護程序身分執行 Bun 應用程式,您需要在 /lib/systemd/system/ 中建立一個服務檔案

cd /lib/systemd/system
touch my-app.service

以下是系統啟動時執行應用程式的典型服務檔案。您可以將其用作自己服務的範本。將 YOUR_USER 取代為您要以其身分執行應用程式的使用者名稱。若要以 root 身分執行,請將 YOUR_USER 取代為 root,但基於安全性考量,通常不建議這麼做。

請參閱 systemd 文件,以取得每個設定的更多資訊。

my-app.service
[Unit]
# describe the app
Description=My App
# start the app after the network is available
After=network.target

[Service]
# usually you'll use 'simple'
# one of https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
Type=simple
# which user to use when starting the app
User=YOUR_USER
# path to your application's root directory
WorkingDirectory=/home/YOUR_USER/path/to/my-app
# the command to start the app
# requires absolute paths
ExecStart=/home/YOUR_USER/.bun/bin/bun run index.ts
# restart policy
# one of {no|on-success|on-failure|on-abnormal|on-watchdog|on-abort|always}
Restart=always

[Install]
# start the app automatically
WantedBy=multi-user.target

如果您的應用程式啟動網頁伺服器,請注意非 root 使用者預設無法監聽埠 80 或 443。若要在非 root 使用者執行時永久允許 Bun 監聽這些埠,請使用下列指令。以 root 身分執行時不需要這個步驟。

sudo setcap CAP_NET_BIND_SERVICE=+eip ~/.bun/bin/bun

設定好服務檔案後,您現在可以啟用服務。啟用後,它會在重新開機時自動啟動。這需要 sudo 權限。

sudo systemctl enable my-app

若要在不重新開機的情況下啟動服務,您可以手動啟動它。

sudo systemctl start my-app

使用 systemctl status 檢查應用程式的狀態。如果您已成功啟動應用程式,您應該會看到類似以下的內容

sudo systemctl status my-app
● my-app.service - My App
     Loaded: loaded (/lib/systemd/system/my-app.service; enabled; preset: enabled)
     Active: active (running) since Thu 2023-10-12 11:34:08 UTC; 1h 8min ago
   Main PID: 309641 (bun)
      Tasks: 3 (limit: 503)
     Memory: 40.9M
        CPU: 1.093s
     CGroup: /system.slice/my-app.service
             └─309641 /home/YOUR_USER/.bun/bin/bun run /home/YOUR_USER/application/index.ts

若要更新服務,請編輯服務檔案的內容,然後重新載入守護程序。

sudo systemctl daemon-reload

有關服務單元設定的完整指南,您可以查看 此頁面。或參閱此常見指令秘笈

sudo systemctl daemon-reload # tell systemd that some files got changed
sudo systemctl enable my-app # enable the app (to allow auto-start)
sudo systemctl disable my-app # disable the app (turns off auto-start)
sudo systemctl start my-app # start the app if is stopped
sudo systemctl stop my-app # stop the app
sudo systemctl restart my-app # restart the app