Nohup和Screen是Shell中实现后台持久运行的两种方案:Nohup适用于无需交互的一次性任务,通过忽略SIGHUP并重定向输出来实现;Screen适用于需中途查看、交互或复用会话的场景,通过创建独立伪终端维持会话。

在Shell中让任务在后台持续运行,关键不是简单加&,而是要解决进程与终端的绑定问题——一旦SSH断开或终端关闭,未妥善处理的后台任务会被系统发送SIGHUP信号终止。Nohup和Screen是两种主流方案,适用场景不同:Nohup适合一次性、无需交互的长期任务;Screen适合需要中途查看、交互或复用会话的场景。
用Nohup启动免挂起任务
Nohup(no hang up)通过忽略SIGHUP信号,配合重定向输出,确保命令脱离终端后仍能运行。基本用法是:nohup command > output.log 2>&1 &。注意三点:
-
必须重定向stdout和stderr,否则nohup会默认生成
nohup.out,且日志可能混乱;2>&1表示将错误输出合并到标准输出流 -
末尾的
&不能省略,否则命令会在前台阻塞当前Shell,无法继续输入其他指令 - 启动后可直接退出终端,进程由init(PID 1)接管,不受SSH断连影响
用Screen创建可恢复的会话环境
Screen是一个终端复用器,它在后台维持一个独立的伪终端,所有操作(包括运行、暂停、切换、重连)都在该会话内完成。典型流程如下:
- 新建会话:
screen -S myjob(-S指定会话名,便于后续识别) - 在会话中运行任意命令(支持交互式程序如vim、top、python REPL)
- 按
Ctrl+A再按D分离(detach)会话,回到原Shell,任务仍在后台运行 - 重新连接:
screen -r myjob(若只一个会话,可省略名称);若会话已僵死,可用screen -d -r强制接管
对比选择与常见误区
选Nohup还是Screen,取决于任务是否需要后续交互或状态监控:
- 下载大文件、跑训练脚本、启动Web服务等“启动即不管”的任务,Nohup更轻量、无依赖、脚本友好
- 调试服务、监控日志滚动、多任务分屏管理、需中途干预的任务,Screen更灵活可靠
- 误区:仅用
command &就以为后台持久——实际仍受终端生命周期约束;误区:认为Nohup能“完全屏蔽信号”——它只忽略SIGHUP,SIGTERM、SIGKILL仍可正常终止进程
补充技巧:查看与清理后台任务
无论用哪种方式,都建议掌握基础排查手段:
- 查Nohup启动的进程:
ps aux | grep "your_command"或结合pgrep -f "keyword" - 查Screen会话状态:
screen -ls,显示Attached/Detached状态 - 安全终止:优先用
kill [PID]发送SIGTERM;确认无响应再用kill -9 [PID] - 避免残留:Screen会话结束后执行
exit或Ctrl+D彻底退出,否则会话仍存在于列表中

















