13 10 月 2026

这个场景你一定遇到过:在服务器上跑了游戏服务端,本地网络一抖、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 / 内存 / 磁盘 / 带宽》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:systemd 服务编写与开机自启实战:让程序开机自动跑、崩了自动重启
  2. 下一篇:云服务器配置怎么选:CPU、内存、带宽、硬盘一次讲明白
发表评论 3