【运维】后端部署从 screen 升级为 systemd 服务

2026-11-03 14:59:12

以前用 screen

用 FastAPI 写好后端上传到服务器,以前我都是靠 screen 把程序挂在后台跑。

好处就是操作简单,可以快速看到部署结果。

问题:

# 查看当前有哪些后台会话
screen -list

# 新建一个名为 api 的后台会话
screen -S api

# 回到名为 api 的会话(之后手动重启 Python 服务,再按 Ctrl + A + D 退出)
screen -rd api

# 直接销毁名为 api 的会话
screen -S api -X quit

# 或者先进入会话,按 Ctrl + C 停掉程序,再执行 exit 退出
screen -S api

现在做成 systemd 服务

systemd 服务可以完美解决 screen 遇到的问题。

新建服务文件:

vi /etc/systemd/system/myapp.service

其中 myapp.service 表示服务名叫 myapp,也可以按实际情况改成别的名字。

[Unit]
Description=Fastapi backend project
After=network.target mongod.service

[Service]
# 改成服务器上 fastapi-project-dir 的实际目录
WorkingDirectory=/home/Users/fastapi-project-dir
# 改成你现在启动用的 python(有 venv 就填 venv 里的,用 which python3 能查到)
ExecStart=/usr/bin/python3 -m uvicorn app.main:app --host 127.0.0.1 --port 4000
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

配置字段逐项说明:
• Description:服务的描述信息,systemctl status 时会显示,方便识别。
• After:定义启动顺序,表示本服务在网络和 mongod.service 就绪之后再启动。它只管顺序,不代表强依赖。
• WorkingDirectory:服务的工作目录,ExecStart 里的相对路径都基于这里,必须指向项目实际所在目录。
• ExecStart:启动命令。要填当前环境实际使用的 Python 解释器路径;如果用了虚拟环境,就填 venv 里的那个。
• Restart=always:进程退出后总是自动重启,实现崩溃自愈。
• RestartSec=3:重启前等待 3 秒,避免频繁重启打满日志。
• WantedBy=multi-user.target:安装目标,enable 时据此建立开机自启的软链接。

执行下面两行让配置生效:

sudo systemctl daemon-reload        # 让 systemd 读取新文件
sudo systemctl enable --now myapp   # 开机自启 + 立即启动

只要 myapp.service 文件内容有变动,就要执行一次 sudo systemctl daemon-reload 让配置生效。

之后每次更新代码,只需执行 sudo systemctl restart myapp 就搞定了,不用再像 screen 那样先进后台、再手动重启、再退出。

常用管理命令:

sudo systemctl status myapp      # 查看服务状态
sudo systemctl restart myapp     # 重启服务
sudo systemctl stop myapp        # 停止服务
sudo systemctl disable myapp     # 取消开机自启
sudo journalctl -u myapp -f      # 实时跟踪服务日志

↶ 返回首页 ↶

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: