一、screen 是什么?

在使用云服务器或远程 Linux 服务器时,我们经常会通过 SSH 连接服务器运行程序。例如训练深度学习模型、下载数据、执行长时间脚本等。

但是如果 SSH 连接断开,普通终端中正在运行的程序也可能会被中断。为了解决这个问题,可以使用 screen

screen 是 Linux 中常用的终端复用工具。它可以创建一个独立的终端会话,即使 SSH 断开,程序仍然会在服务器后台继续运行。之后重新登录服务器后,可以重新进入原来的 screen 会话继续查看输出。

简单来说:

screen 可以让程序脱离当前 SSH 连接,在服务器后台持续运行。


二、安装 screen

有些服务器默认已经安装了 screen,可以先检查:

screen --version

如果没有安装,可以使用以下命令安装。

Ubuntu / Debian:

sudo apt update
sudo apt install screen

CentOS:

sudo yum install screen

三、创建一个新的 screen 会话

最常用的方式是创建一个带名字的 screen 会话:

screen -S session_name

例如:

screen -S train

这样就创建了一个名为 train 的 screen 会话。

进入该会话后,就可以像普通终端一样运行程序:

python train.py

四、退出 screen 但不关闭程序

这是 screen 最重要的操作之一。

在 screen 会话中,如果想让程序继续在后台运行,并临时退出当前会话,需要按:

Ctrl + A,然后按 D

也就是:

  1. 先按 Ctrl + A
  2. 松开后再按 D

此时终端通常会显示:

[detached from xxxx.train]

这表示已经成功离开 screen 会话,但里面的程序仍然在后台运行。

注意:

exit

会直接退出当前 screen 会话,如果里面没有其他程序,screen 会话也会结束。

所以,如果只是想让程序在后台继续跑,不要输入 exit,而是使用:

Ctrl + A + D

五、查看当前有哪些 screen 会话

可以使用:

screen -ls

示例输出:

There are screens on:
    12345.train    (Detached)
    23456.test     (Attached)
2 Sockets in /run/screen/S-user.

常见状态有两种:

状态 含义
Detached 当前没有人进入该 screen,可以直接恢复
Attached 当前该 screen 正在被某个终端占用

六、重新进入 screen 会话

如果 screen 状态是 Detached,可以使用:

screen -r session_name

例如:

screen -r train

也可以使用完整 ID:

screen -r 12345

七、强制进入已经 Attached 的 screen

有时候使用:

screen -ls

会看到某个 screen 是 Attached 状态。

这通常说明:

  1. 该 screen 正在被另一个终端使用;
  2. 或者之前 SSH 异常断开,screen 还以为原来的终端仍然连接着。

此时如果直接执行:

screen -r train

可能会报错。

可以使用以下命令强制接管:

screen -d -r train

含义是:

  • -d:先把原来连接的终端 detach 掉;
  • -r:再重新进入该 screen。

如果还是不行,可以使用:

screen -D -r train

这个命令更强制一些,适合处理异常断开的情况。


八、创建并直接运行命令

有时可以创建 screen 会话并直接运行程序:

screen -S train python train.py

不过我个人更推荐先进入 screen:

screen -S train

然后再手动运行程序:

python train.py

这样更方便查看环境、路径和报错信息。


九、关闭 screen 会话

如果程序已经运行完,想关闭当前 screen,可以在 screen 内输入:

exit

如果当前 screen 中没有其他前台程序,执行后会退出并关闭该 screen 会话。

也可以按:

Ctrl + D

效果类似于退出当前 shell。


十、杀死指定 screen 会话

如果想直接关闭某个 screen,可以先查看会话:

screen -ls

然后使用:

screen -S session_name -X quit

例如:

screen -S train -X quit

如果有多个同名或需要指定 ID,可以使用:

screen -S 12345.train -X quit

十一、screen 中如何向上滚动查看日志?

在普通终端中,鼠标滚轮通常可以向上查看历史输出。但在 screen 中,有时候鼠标滚轮不能直接查看前面的日志。

这时可以进入 screen 的复制/滚动模式:

Ctrl + A,然后按 [

也就是:

  1. 按 Ctrl + A
  2. 松开后按 [

进入滚动模式后,可以使用:

↑ / ↓
PageUp / PageDown

或者使用 Vim 风格按键:

k:向上
j:向下

退出滚动模式:

q

或者按:

Esc

十二、常用快捷键总结

快捷键 功能
Ctrl + A,然后 D 暂时退出 screen,让程序后台运行
Ctrl + A,然后 [ 进入滚动模式,查看历史输出
q 或 Esc 退出滚动模式
Ctrl + A,然后 C 在当前 screen 中创建新窗口
Ctrl + A,然后 N 切换到下一个窗口
Ctrl + A,然后 P 切换到上一个窗口
Ctrl + A,然后 " 查看当前 screen 内的窗口列表
Ctrl + D 退出当前 shell,可能关闭 screen

十三、常用命令总结

命令 功能
screen -S name 创建名为 name 的 screen 会话
screen -ls 查看所有 screen 会话
screen -r name 恢复进入指定 screen
screen -d -r name 强制断开原连接并进入 screen
screen -D -r name 更强制地接管 screen
screen -S name -X quit 关闭指定 screen
screen --version 查看 screen 版本

十四、一个实际使用示例

假设我要在服务器上训练一个深度学习模型,训练时间可能需要几个小时甚至更久。

1. 创建 screen

screen -S train_lstm

2. 进入项目目录

cd /data/THz_lossprediction

3. 激活环境

conda activate THz

4. 运行训练脚本

python train_lstm_seq2seq.py

5. 退出 screen,让程序后台运行

按:

Ctrl + A,然后按 D

此时即使关闭 SSH,程序也会继续在服务器上运行。

6. 下次重新连接服务器后查看 screen

screen -ls

7. 重新进入训练会话

screen -r train_lstm

如果显示该会话已经是 Attached 状态,可以使用:

screen -d -r train_lstm

十五、建议:重要任务最好保存日志

虽然 screen 可以查看终端输出,但如果输出太多,历史内容可能不方便查找。因此运行长时间任务时,最好把日志保存到文件中。

例如:

python train.py > train.log 2>&1

含义是:

  • >:把标准输出保存到文件;
  • 2>&1:把错误输出也保存到同一个文件;
  • train.log:日志文件名。

如果想一边看输出,一边保存日志,可以使用:

python train.py 2>&1 | tee train.log

这样终端会显示输出,同时也会保存到 train.log 文件中。

之后可以使用:

tail -f train.log

实时查看日志。


十六、screen 和 nohup 的区别

除了 screen,很多人也会使用 nohup 后台运行程序。

例如:

nohup python train.py > train.log 2>&1 &

两者区别如下:

工具 特点
screen 可以重新进入会话,适合交互式查看程序输出
nohup 更适合简单后台运行命令,不方便重新进入交互界面

如果是训练模型、调试程序、需要反复查看输出,我更推荐使用 screen

如果只是让一个简单脚本在后台运行,nohup 也可以。


十七、总结

screen 是远程服务器中非常实用的工具,尤其适合运行长时间任务,例如模型训练、数据处理、下载文件等。

最常用的几个命令其实并不多:

screen -S name
screen -ls
screen -r name
screen -d -r name
screen -S name -X quit

最重要的快捷键是:

Ctrl + A,然后 D

它可以让我们退出当前 screen,但不终止里面正在运行的程序。

对于经常使用云服务器或远程 Linux 环境的人来说,熟练掌握 screen 可以有效避免 SSH 断开导致程序中断的问题,也能让长时间任务管理更加方便。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐