直接关SSH窗口会发送SIGHUP信号终止前台进程;screen通过创建独立虚拟终端使进程脱离登录会话,支持分离(Ctrl+A+D)和重连查看实时输出。

能挂住,但必须用 Ctrl+A 再按 D 分离,直接关终端或 exit 会杀进程。
为什么直接关 SSH 窗口程序就死了?
SSH 断开时系统会发 SIGHUP 信号给所有前台进程,默认行为是退出。& 和 nohup 能躲掉这个信号,但没法再连回去看输出——你只能靠日志文件猜发生了什么。
screen 的本质是创建一个独立于 SSH 会话的虚拟终端,进程归属它、不归属你的登录 session,所以断网后照样跑,还能随时 reconnect 查实时输出。
创建并进入 screen 会话的正确姿势
别裸敲 screen,容易起一堆无名会话,后期难管理:
- 用
screen -S myjob创建命名会话(myjob换成你自己的描述性名字,比如train-gpt2) - 进会话后,先
cd到代码所在目录,再运行命令,比如python train.py - 确认程序已启动、有输出后再分离,别刚敲完回车就走
分离和重连的常见卡点
分离必须用快捷键:Ctrl+A 松开,再按 D(不是 Ctrl+D,那是退出当前 shell);输错会直接退出会话,进程就没了。
重连时如果报 There is no screen to be resumed,说明会话处于 “Attached” 状态(可能别人正连着,或上次没干净分离):
- 先执行
screen -d -r myjob强制踢掉已有连接 - 再
screen -r myjob连上 - 多个会话并存时,
screen -ls输出里带Detached的才是可连的;带Attached的得先-d -r
怎么安全结束一个 screen 会话?
别在本地终端敲 kill 或 pkill screen,可能误杀其他会话。正确做法只有一种:
- 先
screen -r myjob进去 - 在会话内运行
exit(或Ctrl+D),整个会话连同里面所有进程一起退出 - 如果卡死、假死,回到外层 shell 执行
screen -X -S myjob quit
真正容易被忽略的是:screen 本身不自动清理僵尸窗口,screen -ls 里残留的 Dead 或 ??? 会话,得用 screen -wipe 手动清掉,否则下次 -r 可能匹配错目标。


















