对于个人站长和VPS管理员来说,执行长时间运行的任务(如大型数据库备份、软件编译或系统更新)时,最担心SSH连接中断导致任务失败。Linux运维神器 screen(或者类似的 tmux)可以完美解决这个问题。
screen 是一个终端多路复用器(Terminal Multiplexer),它允许用户在一个 SSH 会话中创建和管理多个虚拟终端会话,并且最重要的是,即使您断开 SSH 连接,这些会话和其中运行的程序仍将继续在后台运行。
第一步:安装 Screen
大多数 Linux 发行版默认可能未安装 screen。根据您的系统类型,使用以下命令安装:
Debian/Ubuntu 系统:
sudo apt update
sudo apt install screen -y
CentOS/RHEL 系统:
sudo yum install screen -y
# 或者对于新系统
sudo dnf install screen -y
第二步:启动和命名会话
强烈建议在启动会话时为其命名,方便后续查找和管理。
1. 启动一个新的命名会话
假设我们要运行一个数据库备份任务,我们可以将其命名为 db_backup:
screen -S db_backup
执行此命令后,您会进入一个新的虚拟终端界面。在这个界面中,您可以执行任何需要长时间运行的命令,例如:
# 模拟一个需要运行很长时间的脚本
./run_long_backup.sh
第三步:脱离(Detach)会话
当您的命令开始运行后,或者您需要暂时离开终端但又不希望任务中断时,您需要“脱离”当前的 screen 会话。
所有 screen 的控制命令都通过特定的组合键开始,默认为 Ctrl + a。
脱离会话的快捷键:
按下 Ctrl + a,然后立即按下 d (detach)。
(Ctrl + a) + d
执行后,您将返回到原始的 SSH 终端,并会看到类似以下提示,表明您的会话已在后台运行:
[detached from 12345.db_backup]
第四步:查看和重新连接(Reattach)会话
您可以使用 screen -ls 命令查看当前所有正在运行的 screen 会话列表。
1. 列出所有会话
screen -ls
输出示例:
There are screens on:
12345.db_backup (Detached)
67890.update_os (Attached)
2 Sockets in /run/screen/S-username.
2. 重新连接会话
要重新进入名为 db_backup 的会话,使用 -r 选项加上会话名称或 PID:
screen -r db_backup
# 或者使用PID:
screen -r 12345
如果只有一个脱离的会话,也可以直接使用 screen -r。
第五步:会话内窗口管理(高级用法)
screen 最强大的地方在于它允许在一个会话内创建多个窗口,就像浏览器标签页一样。
所有操作都需要先按下 Ctrl + a,然后是以下命令键:
| 命令 | 动作 | 描述 |
|---|---|---|
| Ctrl + a c | Create | 创建一个新的窗口 |
| Ctrl + a n | Next | 切换到下一个窗口 |
| Ctrl + a p | Previous | 切换到上一个窗口 |
| Ctrl + a “ | List Windows | 列出所有窗口,并允许选择切换 |
| Ctrl + a k | Kill Window | 关闭当前窗口(如果这是最后一个窗口,则整个会话终止) |
| Ctrl + a A | Title | 命名当前窗口 |
例如,在 db_backup 会话中,您正在进行备份,但还想同时编辑一个配置文件,可以执行:
- 按下 Ctrl + a c 创建一个新窗口。
- 在新窗口中编辑文件:vim /etc/nginx/nginx.conf。
- 按下 Ctrl + a p 切换回备份窗口查看进度。
第六步:结束会话
当会话内的所有任务完成后,直接退出终端(例如输入 exit 或按下 Ctrl + d)即可终止整个 screen 会话。
如果想强制终止一个脱离的会话(例如会话卡死),可以使用 -X quit 加上会话名称:
screen -X -S db_backup quit
汤不热吧