直接用&不能防止ssh断开导致任务终止,因其仍挂靠终端会话;真正关键是切断进程与终端的信号绑定关系:nohup(忽略sighup)、setsid(新建会话)、disown(补救已启后台任务)、screen/tmux(可重连虚拟终端)。

直接用 & 符号不能防止 SSH 断开导致任务终止——它只让命令在后台跑,但进程仍挂靠在当前终端会话下,一旦 SSH 断连,系统会发 SIGHUP 信号终止所有关联进程。真正要“断开 SSH 不中断”,关键不是后台运行本身,而是**切断进程与终端的信号绑定关系**。
nohup:最常用、最稳妥的入门方案
它专为解决挂断信号(SIGHUP)设计,原理是让进程忽略该信号,并自动重定向输出。
- 基本写法:
nohup your_command & - 输出默认写入当前目录的
nohup.out;如需自定义日志,加重定向:nohup python server.py > server.log 2>&1 & - 执行后会显示类似
[1] 12345(作业号和 PID),接着可安全输入exit或关闭终端 - 注意:
nohup不改变进程会话归属,但它已足够应对绝大多数长任务场景
setsid:更彻底的脱离方式
它让命令启动时就创建新会话,父进程直接变成 init(PID 1),完全不依赖当前终端。
- 无需
&,直接运行:setsid python server.py > log.txt 2>&1 - 没有作业号,也不出现在
jobs列表里,ps查看时 PPID 是 1 - 适合不想留任何终端痕迹、或担心
nohup在某些 shell 中行为异常的情况
disown:补救已启动但没加 nohup 的任务
适用于你已经用 & 启动了命令,但还没退出终端,想临时补救。
- 先确认任务状态:
jobs,看到类似[1]+ Running ./script.sh & - 执行:
disown %1(%1 是作业号)或disown(若只有一个后台任务) - 之后再退出终端,该任务就不会收到
SIGHUP - 注意:它只是把作业从 shell 管理列表中移除,不改变进程会话,可靠性略低于
nohup或setsid
screen / tmux:需要交互或随时查看输出时的首选
它们不是让进程“后台”,而是提供可分离的虚拟终端,SSH 断开后会话仍在,重连即可恢复操作界面。
-
screen -S mytask→ 运行命令 →Ctrl+A, D分离 → 断开 SSH → 重连后screen -r mytask恢复 -
tmux new -s mytask→ 运行命令 →Ctrl+B, D→tmux attach -t mytask - 优势在于能实时看 stdout/stderr、支持键盘交互(比如按 Ctrl+C 停止)、多窗格管理











