Appearance
用 screen 让长时间部署任务安全地在后台运行

场景:
ceph-cluster deploy -v这类部署命令耗时长,想关掉 SSH 下班,第二天回来再看进度。本文记录踩过的坑和最终方案。
问题背景
执行集群部署命令:
bash
ceph-cluster deploy -v这个命令耗时非常久。为了到点下班,直觉是用 & 丢到后台:
bash
ceph-cluster deploy -v &然后关掉 SSH。结果第二天回来发现进程早就没了。
坑一:只用 &,SSH 断开会杀掉进程
& 只是把进程放到后台,它仍然是当前 shell 会话的子进程。SSH 断开时,系统会向该会话下的所有子进程发送 SIGHUP 信号,进程默认行为就是退出。
所以想脱离 SSH 存活,必须让进程忽略 SIGHUP,或者脱离当前会话。
坑二:nohup 遇上交互式确认直接翻车
用 nohup 可以忽略 SIGHUP:
bash
nohup ceph-cluster deploy -v > deploy.log 2>&1 &但这条命令执行后弹出了一个交互提示:
text
? Confirm to deploy cluster? (y/N)nohup 会把标准输入(stdin)断开。程序去读这个 y 时读到的是 EOF,很多程序默认把它当作 N(No),于是直接退出,部署根本没开始。
查看帮助确认没有跳过确认的参数:
bash
ceph-cluster deploy --help输出里没有 -y / --yes / --non-interactive 之类的选项,这个交互躲不掉。
坑三:Ctrl+Z → bg → disown 可以抢救,但风险高
已经在前台跑起来、输入 y 之后,可以用这套组合切后台:
bash
# 1. 输入 y 回车,等它开始刷日志
# 2. 按 Ctrl+Z 挂起
bg # 让挂起的任务在后台继续
disown # 从当前 shell 任务表移除,SSH 断开不受影响但这套方案有两个致命问题:
disown之后无法再用fg调回前台,中途如果卡在交互提示上,你看不到也答不了。- 只能抢救一次交互,后续若还有确认步骤照样翻车。
坑四:机器没外网,装不了 tmux
想装 tmux 一劳永逸:
bash
tmux -V || yum install -y tmux结果 yum 报错,DNS 都解析不了:
text
Could not resolve host: mirrorlist.centos.org; Unknown error
Cannot find a valid baseurl for repo: base/7/x86_64这台 CentOS 7 机器没有外网,yum 装不了任何东西。
最终方案:用系统自带的 screen
检查一下有没有 screen:
bash
screen -v输出:
text
Screen version 4.01.00devel (GNU) 2-May-06自带的,完美。screen 会创建一个独立于 SSH 会话的伪终端,交互完全正常,断开 SSH 也不受影响。
操作步骤
1. 新建一个 screen 会话
bash
screen -S deploy2. 在 screen 里正常执行部署命令
bash
ceph-cluster deploy -v看到交互提示时正常输入:
text
? Confirm to deploy cluster? (y/N) → y让它开始刷日志。
3. 确认跑起来后,detach 脱离会话
text
Ctrl + A 松开
再按 D两个动作分开按,不是同时按。成功后会回到普通 shell,提示类似:
text
[detached from 12345.deploy]现在部署进程在 screen 里独立运行,关掉 SSH、下班走人,完全不受影响。
4. 第二天回来查看进度
bash
screen -ls # 列出所有 screen 会话
screen -r deploy # attach 回 deploy 会话进去后能看到完整界面和当前进度。如果部署已结束,看过结果后输入 exit 退出。
常见问题
screen -r deploy 提示 Attached
说明这个会话在别的地方还连着。先 detach 再 attach:
bash
screen -d deploy
screen -r deployscreen -ls 显示 Dead
会话已经结束,清理记录即可:
bash
screen -wipe方案对比
| 方案 | 能否应对交互 | SSH 断开存活 | 是否需安装 | 适用场景 |
|---|---|---|---|---|
& | 否 | ❌ | 否 | 极短任务 |
nohup ... & | ❌ | ✅ | 否 | 无交互的长时间任务 |
Ctrl+Z+bg+disown | 只能抢救一次 | ✅ | 否 | 应急,后续无交互 |
tmux | ✅ | ✅ | 需安装 | 理想方案,但受限环境装不了 |
screen | ✅ | ✅ | 系统自带 | 本文推荐 |
总结
- 长时间部署任务不要只用
&,SSH 一断就没了。 nohup能防SIGHUP,但遇到交互式确认会因为 stdin 断开而直接退出。- 没外网装不了
tmux时,系统自带的screen是最佳选择。 - 核心记忆点:
Ctrl+A然后D是 detach,screen -r <name>是恢复。
一条命令保平安:
bash
screen -S deploy打完收工,到点下班。
