Skip to content

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

用 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 deploy

2. 在 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 deploy

screen -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

打完收工,到点下班。

最后更新2026/10/20 16:20
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal