运行时包管理器打包器测试运行器代码检查格式化指南参考博客反馈

使用 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 # 重启应用