nohup command > log 2>&1 &是最直接有效的彻底后台运行写法:nohup忽略sighup确保断连存活,>log重定向stdout避免混用nohup.out,2>&1合并stderr保错,&真正后台释放终端。

nohup 是最直接有效的办法,配合 & 和输出重定向,能覆盖 90% 的简单长期任务场景。它不依赖额外安装、不需学习快捷键,只要写对参数,断开 SSH 后进程就真的不会退出。
为什么只用 & 不行?
单独加 & 只是把命令丢到后台,但进程仍属于当前终端会话。一旦 SSH 断开或终端关闭,系统会向该会话所有子进程发送 SIGHUP(挂断信号),进程随即终止——你看到的“后台运行”,其实只是没占着提示符,本质仍是“前台绑定”。
nohup command > log 2>&1 & 每个部分都关键
这条命令不是随便拼起来的,每个符号都有明确作用:
-
nohup:让进程忽略SIGHUP,这是存活的前提 -
> log:必须显式重定向标准输出,否则默认写入nohup.out,容易和别的任务混在一起 -
2>&1:错误输出必须合并进日志,否则stderr丢失,出错时根本看不到报错信息 -
&:确保命令立即返回 shell,不卡住当前终端
示例:nohup python3 train.py > train.log 2>&1 &
已经跑起来了,还能救吗?
如果程序已在前台运行(比如刚敲了 python3 app.py,还没 Ctrl+C),别急着 kill 重来:
- 按
Ctrl+Z暂停它,变成 stopped 状态 - 执行
bg让它在后台继续运行 - 再执行
disown -h %1(%1是jobs显示的作业编号),切断它和当前 shell 的关联
注意:disown 不影响已打开的文件描述符,但无法补救那些依赖终端交互(如读取 /dev/tty)的程序。
什么情况下 nohup 就不够用了?
当你需要做这几件事中的任意一项,就得换 screen 或 tmux:
- 中途想重新连上去看实时输出(
tail -f太被动) - 要临时中断任务(比如按
Ctrl+C)、调参数、再继续 - 同时管理多个相关任务(比如一边跑训练,一边查 GPU 占用、看日志)
screen 上手快:screen -S myrun → 运行命令 → Ctrl+A 再按 D 分离 → 下次登录后 screen -r myrun 接回。真正麻烦的是忘记命名会话,导致 screen -ls 里一堆 Dead 或无名会话,排查起来反而更费时间。











