systemd 是 Linux 作業系統的初始化系統和服務管理員,用於管理系統處理程序和服務的啟動和控制。
若要使用 systemd 以守護程序身分執行 Bun 應用程式,您需要在 /lib/systemd/system/
中建立一個服務檔案。
cd /lib/systemd/system
touch my-app.service
以下是系統啟動時執行應用程式的典型服務檔案。您可以將其用作自己服務的範本。將 YOUR_USER
取代為您要以其身分執行應用程式的使用者名稱。若要以 root
身分執行,請將 YOUR_USER
取代為 root
,但基於安全性考量,通常不建議這麼做。
請參閱 systemd 文件,以取得每個設定的更多資訊。
[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