为什么 SSH 一断,任务就死
你在 SSH 会话里启动的进程,会话断开时会收到 SIGHUP 信号(挂断),默认行为就是退出。数据迁移跑到 80% 网线一抖、晚上盯大版本发布到家半路断网——全栽在这。两个解法各管一半:nohup 让进程「听不见」挂断信号,tmux 让会话「搬」到服务器上。
nohup:最轻量的后台保命
$ nohup ./data-migrate.sh > migrate.log 2>&1 &
[1] 31521
$ tail -f migrate.log # 另开窗口盯进度拆解这行标配:nohup 免疫 SIGHUP、> migrate.log 2>&1 把输出和错误都写进日志(不写的话默认进 nohup.out)、末尾 & 丢到后台。缺一不可——只加 & 不加 nohup,断线照样死;只加 nohup 不加 &,你的终端会被输出糊满。
nohup 的局限:进程活着,但你回不到那个现场——看不到实时画面、不能交互输入。想要「断线重连后一切如初」,用 tmux。
tmux:把终端会话放在服务器上
$ tmux new -s work # 新建名为 work 的会话(在里面正常干活)
$ tmux ls # 列出所有会话
work: 2 windows (created ...) ← 断线后它还在
# 会话内 Ctrl+b d → 分离(detach),回到外层 shell
$ tmux a -t work # 重新附着(attach),画面原样恢复心智模型一句话:tmux 会话活在服务器上,SSH 只是你的「观看窗口」——窗口碎了,会话还在。重连一句 tmux a -t work,正在跑的任务、打开的 vim、滚动的日志原样都在。
两个高频快捷键(都在 Ctrl+b 前缀之后):c 新建窗口、[ 进入滚动模式(PgUp/PgDn 翻历史日志,q 退出)。老牌的 screen 命令同理,新项目无脑选 tmux。
实战:盯一次大版本发布的正确姿势
# 1. 发布开始前,先开 tmux 会话
$ tmux new -s release-0328
# 2. 会话里执行发布脚本 + 盯日志
$ ./deploy.sh | tee deploy.log
$ tail -f /var/log/app/app.log
# 3. 下班回家路上网络断了?到家后:
$ tmux a -t release-0328 # 全部画面原样恢复,一个字节没丢顺带一提:发布频繁、服务要常驻的,别用 nohup 也不用 tmux——那是下一篇 systemd 的活,把服务注册成系统单元才能开机自启、崩溃自动拉起。
评论 (0)