執行環境套件管理器打包器測試執行器程式碼檢查格式化指南參考部落格意見回饋

使用 systemd 將 Bun 作為守護行程執行

systemd 是 Linux 的初始化系統和服務管理器。它負責管理系統行程和服務的啟動與控制。


要使用 systemd 將 Bun 應用作為守護行程執行,請在 /etc/systemd/system/ 中建立一個_服務檔案_。

terminal
cd /etc/systemd/system
touch my-app.service

以下是一個典型的服務檔案,可在系統啟動時執行應用。請將其用作自己服務的模板。將 YOUR_USER 替換為執行應用的使用者名稱稱。若要以 root 身份執行,請將 YOUR_USER 替換為 root,並將 /home/YOUR_USER 替換為 /root(root 的主目錄)。出於安全考慮,我們不建議以 root 身份執行。

有關每個設定的詳細資訊,請參閱 systemd 文件。

my-app.service
[Unit]
# 描述該應用
Description=My App
# start the app after the network management stack has started
# (this does not wait for the network to be up, see https://systemd.io/NETWORK_ONLINE)
After=network.target

[Service]
# 通常使用 'simple'
# 參見 https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
Type=simple
# 啟動應用使用的使用者
User=YOUR_USER
# 應用程式根目錄路徑
WorkingDirectory=/home/YOUR_USER/path/to/my-app
# 啟動應用的命令
# 需使用絕對路徑
ExecStart=/home/YOUR_USER/.bun/bin/bun run index.ts
# 重啟策略
# 可選值為 {no|on-success|on-failure|on-abnormal|on-watchdog|on-abort|always}
Restart=always

[Install]
# 自動啟動該應用
WantedBy=multi-user.target

如果應用會啟動 Web 伺服器,非 root 使用者預設無法監聽 80 或 443 埠。若要允許 Bun 在以非 root 使用者身份執行環境監聽這些埠,請使用以下命令。該命令需要 sudo 許可權。以 root 身份執行環境,無需執行此步驟。

terminal
setcap CAP_NET_BIND_SERVICE=+eip /home/YOUR_USER/.bun/bin/bun

該命令會將 capability 附加到 bun 二進位制檔案本身。替換該二進位制檔案(例如使用 bun upgrade)會移除此 capability。升級後請重新執行該命令。或者,也可以將 AmbientCapabilities=CAP_NET_BIND_SERVICE 新增到服務檔案的 [Service] 部分。


設定好服務檔案後,_啟用_該服務。啟用後,它會在重啟時自動啟動。啟用服務需要 sudo 許可權。

terminal
systemctl enable my-app

要在不重啟的情況下啟動服務,請手動_啟動_它。

terminal
systemctl start my-app

使用 systemctl status 檢視應用的狀態。如果應用啟動成功,輸出如下所示:

terminal
systemctl status my-app
Text
● my-app.service - My App
     Loaded: loaded (/etc/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 index.ts

要更新服務,請編輯服務檔案,然後重新載入守護行程。

terminal
systemctl daemon-reload

有關服務單元設定的完整指南,請參閱 systemd.service 文件。或者使用以下常用命令速查表:

terminal
systemctl daemon-reload # 通知 systemd 有檔案更改
systemctl enable my-app # 啟用應用(允許自動啟動)
systemctl disable my-app # 停用應用(關閉自動啟動)
systemctl start my-app # 啟動已停止的應用
systemctl stop my-app # 停止應用
systemctl restart my-app # 重啟應用