这个场景你一定遇到过:在服务器上跑了游戏服务端,本地网络一抖、SSH 断了,回来发现进程也没了。
原因很简单:SSH 断开时,系统会向该会话下的所有进程发送挂断信号(SIGHUP),程序默认就退出了。
解决办法有三类:nohup、screen、tmux。这篇讲后两个——它们不只是"防断线",更是多窗口终端管理器,能让你在一台服务器上同时开好几个"标签页"各干各的。
想长时间挂着服务?财富云计算 的云服务器支持 7×24 在线。NAT 型云服务器无独立公网 IP,价格比带独立 IP 的机型省一半以上,适合做内网服务与游戏服务端。
一、三种方案怎么选
| 方案 | 优点 | 缺点 | 适用 |
|---|---|---|---|
nohup cmd & | 零学习成本 | 无法再交互、看不到终端输出 | 临时跑个一次性的后台任务 |
screen | 系统自带率高、简单 | 功能少、分屏弱 | 快速防断线,够用就好 |
tmux | 分屏、脚本化、配置强、会话共享 | 需安装、快捷键要记 | 长期使用,强烈推荐 |
结论:临时应急用 screen,长期主力用 tmux,生产环境跑服务优先写 systemd(见本站《systemd 服务编写与开机自启实战》)。
二、screen:最快上手
安装
apt install screen -y # Debian/Ubuntu
yum install screen -y # CentOS/Rocky核心用法
screen -S cs2 # 创建一个名为 cs2 的会话并进入
# 在会话里正常跑你的程序
./start.sh
# 按 Ctrl+A 然后按 D → 脱离(detach)会话,程序继续跑
# 此时可以安全关闭 SSH
screen -ls # 列出所有会话
screen -r cs2 # 重新接入(reattach)
screen -r 12345 # 用会话 ID 接入(同名时用)
screen -d -r cs2 # 会话被占用时强制接管
screen -x cs2 # 多人同时接入同一会话(结对调试)会话内快捷键(前缀键是 Ctrl+A)
| 快捷键 | 功能 |
|---|---|
Ctrl+A D | 脱离会话(最常用) |
Ctrl+A C | 新建窗口 |
Ctrl+A N | 下一个窗口 |
Ctrl+A P | 上一个窗口 |
Ctrl+A " | 列出所有窗口,可切换 |
Ctrl+A A | 给当前窗口改名 |
Ctrl+A K | 关闭当前窗口 |
Ctrl+A [ | 进入滚动模式(查看历史输出,Esc 退出) |
Ctrl+A ? | 查看全部快捷键 |
Ctrl+A \ | 关闭所有窗口并退出 screen |
实用技巧
# 直接后台启动一个会话(不进入)
screen -dmS backup bash -c "/opt/scripts/backup.sh"
# 给会话记日志
screen -L -S cs2 # 会在当前目录生成 screenlog.0
# 查看某个会话是否还活着
screen -ls | grep cs2
# 杀掉会话
screen -S cs2 -X quit
# 向会话发送命令(自动化用)
screen -S cs2 -X stuff "say 服务器即将重启\n"最后一条在游戏开服里特别好用——可以用脚本远程给服务端控制台发指令。
三、tmux:现代主力方案
安装
apt install tmux -y
yum install tmux -y
tmux -V三个核心概念
server(服务器进程,管理所有会话)
└── session(会话,一个独立的工作区)
└── window(窗口,类似浏览器的标签页)
└── pane(面板,一个窗口可以左右/上下分屏)基础命令
tmux # 新建匿名会话
tmux new -s cs2 # 新建名为 cs2 的会话
tmux ls # 列出会话
tmux attach -t cs2 # 接入会话(可简写 tmux a -t cs2)
tmux a # 接入最近一个会话
tmux kill-session -t cs2 # 杀掉会话
tmux kill-server # 杀掉所有会话
tmux rename-session -t old new脱离会话:Ctrl+B 然后按 D(tmux 的前缀键是 Ctrl+B)。
窗口管理
快捷键(先按 Ctrl+B) | 功能 |
|---|---|
c | 新建窗口 |
, | 重命名当前窗口 |
n / p | 下一个 / 上一个窗口 |
0~9 | 跳到指定编号窗口 |
w | 列出所有窗口,可视选择 |
& | 关闭当前窗口 |
f | 按名字搜索窗口 |
面板分屏(tmux 最大优势)
快捷键(先按 Ctrl+B) | 功能 |
|---|---|
% | 左右分屏 |
" | 上下分屏 |
| 方向键 | 切换面板 |
o | 顺序切换面板 |
x | 关闭当前面板 |
z | 当前面板全屏/还原(再按一次还原) |
Ctrl+方向键 | 调整面板大小 |
{ / } | 面板左右交换 |
空格 | 切换布局(平铺/主次/最大化等) |
! | 把当前面板拆成独立窗口 |
q | 显示面板编号 |
典型用法:左边跑服务端看日志,右边开个 htop 看资源。
tmux new -s monitor
# Ctrl+B % 左右分屏
# 左:tail -f server.log
# 右:htop
# Ctrl+B D 脱离,明天再来看复制模式(滚动查看历史)
tmux 默认不能用鼠标滚轮翻历史,要进复制模式:
Ctrl+B [ 进入复制模式
方向键 / PgUp 滚动
空格 开始选择
Enter 复制并退出
Ctrl+B ] 粘贴如果习惯 vim,可以设为 vi 模式(见下文配置)。
四、tmux 配置:让它更好用
新建 ~/.tmux.conf:
nano ~/.tmux.conf一份实用配置:
# 前缀键改成 Ctrl+A(比 Ctrl+B 好按,且与 screen 一致)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# 窗口/面板编号从 1 开始(0 在键盘最右边,不好按)
set -g base-index 1
setw -g pane-base-index 1
# 重新加载配置
bind r source-file ~/.tmux.conf \; display "配置已重载"
# 分屏用 | 和 - ,更直观
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
# 面板切换用 Alt+方向键,不用按前缀
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
# 开启鼠标:滚轮翻历史、点击切面板、拖动调整大小
set -g mouse on
# vi 风格复制模式
setw -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# 状态栏
set -g status-bg colour235
set -g status-fg colour136
set -g status-left "[#S] "
set -g status-right "%Y-%m-%d %H:%M"
set -g status-interval 5
# 历史行数上限(默认只有 2000,太少)
set -g history-limit 50000
# 减少 ESC 键延迟(vim 用户的福音)
set -sg escape-time 10
# 窗口关闭后自动重新编号
set -g renumber-windows on
# 长时间无操作不自动断开
set -g display-time 4000应用配置:
tmux source-file ~/.tmux.conf
# 或者在会话里按 prefix + r五、tmux 脚本化:一条命令搭好工作环境
写个脚本,开机时一键建立完整工作环境:
nano ~/dev-session.sh
chmod +x ~/dev-session.sh#!/bin/bash
SESSION="work"
# 如果会话已存在就直接接入
tmux has-session -t $SESSION 2>/dev/null
if [ $? -eq 0 ]; then
exec tmux attach -t $SESSION
fi
# 创建会话:窗口 1 跑服务端
tmux new-session -d -s $SESSION -n server
tmux send-keys -t $SESSION:server "cd /opt/steam/cs2 && ./start.sh" C-m
# 窗口 2:日志
tmux new-window -t $SESSION -n logs
tmux send-keys -t $SESSION:logs "tail -f /opt/steam/cs2/server.log" C-m
# 窗口 3:监控,并分成上下两格
tmux new-window -t $SESSION -n monitor
tmux send-keys -t $SESSION:monitor "htop" C-m
tmux split-window -v -t $SESSION:monitor
tmux send-keys -t $SESSION:monitor "watch -n 1 'ss -tulnp | grep 27015'" C-m
# 回到第一个窗口
tmux select-window -t $SESSION:server
exec tmux attach -t $SESSION运行 ~/dev-session.sh,直接得到三窗口工作环境。
脱离后仍能给会话发命令(配合 crontab 做自动化):
tmux send-keys -t work:server "say 服务器 5 分钟后重启" C-m六、tmux 插件(可选)
用 TPM(Tmux Plugin Manager):
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm在 .tmux.conf 末尾加:
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect' # 保存/恢复会话
set -g @plugin 'tmux-plugins/tmux-continuum' # 自动保存
set -g @plugin 'tmux-plugins/tmux-cpu' # 状态栏显示 CPU
set -g @continuum-restore 'on' # 开机自动恢复会话
run '~/.tmux/plugins/tpm/tpm'在会话里按 prefix + I 安装插件,prefix + U 更新。
tmux-resurrect 很实用:服务器重启后能恢复之前的窗口布局(虽然进程本身不会自动重启,配合 systemd 效果最佳)。
七、常见故障
| 问题 | 原因 | 解决 |
|---|---|---|
sessions should be nested... | 在 tmux 里又执行了 tmux | 用 tmux new-window 而不是再开会话 |
接入时提示 already attached | 会话已被其他终端占用 | tmux attach -d -t 名字(踢掉另一个) |
screen 提示 There is no screen to be resumed | 会话处于 Attached 状态 | screen -d -r 名字 |
Attaching from a terminal with... | UTF-8 编码问题 | screen -U -r 名字 |
| 鼠标滚轮不能翻历史 | 没开 mouse / 没进复制模式 | set -g mouse on,或 prefix + [ |
| 终端显示乱码、颜色不对 | TERM 变量错误 | export TERM=xterm-256color |
| 分屏后光标乱跳 | 终端类型不匹配 | 在 .bashrc 加 export TERM=screen-256color(tmux 内) |
| 会话莫名消失 | server 进程被杀 / 系统重启 | tmux 会话不持久化,重启后需重建(或用 continuum 插件) |
八、生产环境的正确姿势
短期/临时任务 → screen 或 tmux,够灵活。
长期常驻服务 → systemd,原因:
- 开机自启(tmux 会话重启后不会自动恢复)
- 崩溃自动重启(tmux 只会保持一个死掉的 shell)
- 统一日志(journalctl)
- 资源限制(MemoryMax 等)
- 权限隔离(用低权限用户跑)
两者结合:用 systemd 跑服务,用 tmux 做运维操作台,互不干扰。
# systemd 跑服务
systemctl status cs2
# tmux 里做运维
tmux new -s ops
# 窗口1: journalctl -u cs2 -f
# 窗口2: htop
# 窗口3: 编辑器改配置九、速查卡
screen
screen -S 名字 创建
Ctrl+A D 脱离
screen -ls 列出
screen -r 名字 接入
screen -S 名字 -X quit 杀掉tmux
tmux new -s 名字 创建
Ctrl+B D 脱离
tmux ls 列出
tmux a -t 名字 接入
Ctrl+B c 新窗口
Ctrl+B % 左右分屏
Ctrl+B " 上下分屏
Ctrl+B 方向键 切面板
Ctrl+B z 面板全屏
Ctrl+B [ 滚动翻历史(q 退出)
tmux kill-session -t x 杀掉长期挂服务建议配一台稳定在线的云服务器。财富云计算 提供 7×24 运行的云服务器;做内网服务、游戏服务端、学习练手推荐 NAT 型(无独立公网 IP,价格比带独立 IP 的机型省一半以上),配合 systemd 就能实现开机自启 + 崩溃自动恢复。
相关阅读:
- 《systemd 服务编写与开机自启实战》
- 《Linux 常用命令速查表》
- 《服务器资源排查:CPU / 内存 / 磁盘 / 带宽》
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]ServerAliveCountMax 3长时间跑任务用 tmux/screen,断开重进会话还在,见screen 与 tmux 会话保持。2.3 本地配置别名# ~/.ssh/config[...]
2026-10-15 回复
[...]每次开新服都要重来一遍:装依赖、建用户、配 Swap、设防火墙、装 SteamCMD、配 systemd……同样的步骤抄十遍,总有一次抄错。这篇把这些固化成一套一键环境脚本:新机器跑一遍,十分钟后就是一个随时可以装任何游戏的标准开服环境。本文基于 财富云计算 NAT 型云服务器(无独立公网 IP、价格比独立 IP 机型省一半以上)的 Ubuntu 22.04 环境编写。脚本可直接抄走,按注释改几个[...]
2026-10-18 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复