Linux 后台运行服务完全指南
一、问题背景
在 Linux 服务器上通过 SSH(如 MobaXterm)运行服务时,一旦关闭终端窗口,启动的服务进程也会随之终止。本文档介绍如何让 uvicorn(FastAPI)和 npm run dev(Vue)在 SSH 断开后继续在后台运行。
二、场景说明
| 服务 | 启动命令 | 端口 |
|---|---|---|
| FastAPI 后端 | uvicorn main:app --reload --host 0.0.0.0 --port 8080 |
8080 |
| Vue 前端 | npm run dev |
通常 5173 或 3000 |
三、解决方案对比
| 方案 | 难度 | 能否恢复查看日志 | 开机自启 | 推荐场景 |
|---|---|---|---|---|
| tmux | ★☆☆ | ✅ 可以 | ❌ | 开发调试(最推荐) |
| nohup | ★☆☆ | ❌ 只能看文件 | ❌ | 快速临时测试 |
| & + disown | ★☆☆ | ❌ 只能看文件 | ❌ | 快速临时测试 |
| systemd | ★★★ | ✅ journalctl | ✅ | 生产部署 |
四、方案一:tmux(推荐)
4.1 安装 tmux
# Ubuntu/Debian
sudo apt update
sudo apt install tmux -y
# CentOS/RHEL
sudo yum install tmux -y
4.2 启动后端服务
# 创建名为 backend 的会话
tmux new -s backend
# 进入后端项目目录
cd /path/to/your/backend
# 启动 FastAPI
uvicorn main:app --reload --host 0.0.0.0 --port 8080
# 脱离会话(保持运行):按 Ctrl+B,松开,再按 D
4.3 启动前端服务
# 创建名为 frontend 的会话
tmux new -s frontend
# 进入前端项目目录
cd /path/to/your/frontend
# 启动 Vue
npm run dev
# 脱离会话(保持运行):按 Ctrl+B,松开,再按 D
4.4 常用 tmux 命令
| 操作 | 命令 |
|---|---|
| 创建新会话 | tmux new -s 会话名 |
| 脱离会话 | Ctrl+B → D |
| 查看所有会话 | tmux ls |
| 重新进入会话 | tmux attach -t 会话名 |
| 关闭会话 | tmux kill-session -t 会话名 |
| 在会话内查看帮助 | Ctrl+B → ? |
4.5 效果说明
关闭 MobaXterm 后,两个服务持续运行。重新连接后执行 tmux attach -t backend 即可回到后端终端,实时查看日志输出。
五、方案二:nohup
5.1 启动后端
cd /path/to/your/backend
nohup uvicorn main:app --reload --host 0.0.0.0 --port 8080 > backend.log 2>&1 &
5.2 启动前端
cd /path/to/your/frontend
nohup npm run dev > frontend.log 2>&1 &
5.3 查看日志
tail -f backend.log
tail -f frontend.log
5.4 关闭进程
# 查看进程
ps aux | grep uvicorn
ps aux | grep node
# 结束进程
kill <PID>
六、方案三:& + disown
6.1 启动后端
cd /path/to/your/backend
uvicorn main:app --reload --host 0.0.0.0 --port 8080 > backend.log 2>&1 &
disown
6.2 启动前端
cd /path/to/your/frontend
npm run dev > frontend.log 2>&1 &
disown
七、注意事项
7.1 端口占用问题
如果提示端口已被占用,查看并结束占用进程:
# 查看端口占用
lsof -i :8080
netstat -tlnp | grep 8080
# 结束进程
kill -9 <PID>
7.2 --reload 模式说明
--reload用于开发环境,代码改动后自动重启- 生产环境建议移除
--reload,改用systemd或gunicorn
7.3 防火墙配置
如需外网访问,确保防火墙放行对应端口:
# Ubuntu (ufw)
sudo ufw allow 8080
sudo ufw allow 5173
# CentOS (firewalld)
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
八、快速参考卡片
最常用 tmux 操作
tmux new -s backend # 创建会话
Ctrl+B → D # 脱离会话
tmux attach -t backend # 恢复会话
tmux ls # 列出会话
tmux kill-session -t backend # 删除会话
最常用 nohup 命令
nohup uvicorn main:app --host 0.0.0.0 --port 8080 > app.log 2>&1 &
tail -f app.log
九、总结建议
| 使用场景 | 推荐方案 |
|---|---|
| 开发调试,需要实时看日志 | tmux |
| 快速测试,不需要再看输出 | nohup |
| 生产环境部署 | systemd + Nginx |
评论区