Linux操作系统-如何在远程会话断开后保持程序一直运行?
在 Linux 服务器上工作,我们经常会遇到这样的场景:通过 SSH 远程连接到服务器,启动了一个耗时的训练任务或数据拷贝,但网络不稳定或需要关闭电脑时,任务就跟着终端一起中断了。如何让程序在终端关闭后依然稳定运行,是每个 Linux 用户的必修课。
本文将详细介绍两种最常用的方法:nohup 和 screen,并通过对比帮你选择最合适的方案。
一、为什么终端关闭,程序就没了?
在 Linux 系统中,当你关闭终端或断开 SSH 连接时,系统会向该终端下的所有进程发送一个 SIGHUP(挂断)信号。大多数进程收到这个信号后,默认行为就是退出。因此,无论是前台任务还是单纯加 & 的后台任务,都难以幸免。
我们的目标,就是让程序“免疫”这个信号,或者干脆让它在一个独立的、不受终端影响的环境中运行。
二、方法一:nohup —— 简单直接的一次性后台运行
nohup 是 “no hang up” 的缩写,它的核心作用就是让进程忽略 SIGHUP 信号。
基本用法
最常用的命令格式如下:
nohup 你的命令 > output.log 2>&1 &
我们来拆解一下这个命令:
nohup:告诉系统,让后面的命令忽略 SIGHUP 信号。你的命令:你要运行的程序或脚本。> output.log:将命令的标准输出重定向到output.log文件。2>&1:将命令的标准错误(2)也重定向到标准输出(1)所在的文件,即output.log。这样,所有的输出和报错信息都会被记录下来,方便排查问题。&:将命令放到后台运行,释放当前的终端。
实际操作示例
假设我们要运行一个名为 print.sh 的shell脚本:
nohup sh print.sh &

执行后,终端会返回一个进程号(PID),并提示输出会写入 nohup.out 文件。此时,你就可以放心地关闭终端或断开 SSH 连接了,shell.sh 会一直在后台运行并每隔5s打印一行“hello world”。退出当前会话,重新远程连接,任务依然在运行。
查看与管理
- 查看输出:使用
tail -f nohup.out可以实时查看程序的输出日志。 - 查找进程:通过
ps -ef | grep print可以找到后台进程的 PID。 - 终止进程:使用
kill PID命令可以结束该后台进程。
注意事项
- 如果忘记重定向输出,
nohup默认会将输出保存到当前目录下的nohup.out文件中。 nohup不会自动将进程转为后台,所以&是必需的。
三、方法二:screen —— 功能强大的会话管家
如果说 nohup 是“一锤子买卖”,那么 screen 就是一个功能强大的终端复用器(Terminal Multiplexer)。它创建一个虚拟终端会话,你可以随时分离(Detach)这个会话,让它安静地在后台运行,之后又可以随时重新连接(Reattach)回来,仿佛从未离开过。
安装 screen
大多数 Linux 发行版默认没有安装 screen,需要手动安装:
- CentOS / RHEL / Fedora:
yum install -y screen - Ubuntu / Debian:
apt-get install -y screen
核心用法
screen 的使用主要围绕以下几个命令:
-
创建会话:
screen -S mysession
这会创建一个名为mysession的新会话,并自动进入。 -
在会话中运行程序:进入会话后,就像在一个正常的终端中一样,运行你的命令即可。
-
分离会话:在会话中,同时按下
Ctrl + A,然后按D键。
你会立即回到原来的终端,而screen会话及其中的所有程序都在后台继续运行。 -
查看会话列表:
screen -ls
这会列出所有处于Attached(已连接)或Detached(已分离)状态的会话。 -
恢复会话:
screen -r mysession
这会重新连接到名为mysession的会话,你将回到之前的工作现场。
实际操作示例
- 创建一个名为
session.1的会话:screen -S session.1。 - 在会话里运行shell命令:
while true;do echo 'hello world';sleep 5 ;done。 - 按
Ctrl + A,再按D分离会话。 - 断开 SSH 连接。
- 重新连上服务器,执行
screen -r session.1,shell命令仍然在运行中。

进阶操作
在 screen 会话中,Ctrl + A 是快捷键的前缀,按下后再按其他键可以实现更多功能:
Ctrl + A,然后按C:在当前的screen会话中创建一个新窗口。Ctrl + A,然后按N/P:切换到下一个 / 上一个窗口。Ctrl + A,然后按K:强制关闭当前窗口。- 在窗口中输入
exit或按Ctrl + D:正常退出并关闭当前窗口。
四、总结:nohup vs screen,我该用哪个?
| 特性 | nohup |
screen |
|---|---|---|
| 核心功能 | 忽略挂断信号,让进程在后台运行 | 创建持久化的虚拟终端会话,可随时重连 |
| 交互性 | 无。启动后无法再与程序交互 | 有。可以随时重新连接到会话,进行交互 |
| 多任务管理 | 不支持。每个命令需单独启动和管理 | 支持。一个会话内可创建多个窗口,管理多个任务 |
| 易用性 | 非常简单,一条命令即可 | 中等,需要学习几个基本命令和快捷键 |
| 安装 | 系统自带,无需安装 | 需要额外安装 |
| 适用场景 | 运行一次性的、无需交互的长期任务 | 需要调试、交互、管理多个任务的复杂场景 |
简单来说:
- 如果你只是要跑一个脚本,不需要再管它,用
nohup是最快捷的选择。 - 如果你需要随时查看进度、进行调试,或者同时管理多个任务,
screen是更专业、更强大的工具。
掌握 nohup 和 screen,能让你在面对长时间运行的任务时更加从容,不再担心网络波动或意外断连。希望这篇博客能帮助你更好地管理 Linux 后台任务。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)