在 Linux 服务器上工作,我们经常会遇到这样的场景:通过 SSH 远程连接到服务器,启动了一个耗时的训练任务或数据拷贝,但网络不稳定或需要关闭电脑时,任务就跟着终端一起中断了。如何让程序在终端关闭后依然稳定运行,是每个 Linux 用户的必修课。
本文将详细介绍两种最常用的方法:nohup 和 screen,并通过对比帮你选择最合适的方案。
一、为什么终端关闭,程序就没了?
在 Linux 系统中,当你关闭终端或断开 SSH 连接时,系统会向该终端下的所有进程发送一个 SIGHUP(挂断)信号。大多数进程收到这个信号后,默认行为就是退出。因此,无论是前台任务还是单纯加 & 的后台任务,都难以幸免。
我们的目标,就是让程序“免疫”这个信号,或者干脆让它在一个独立的、不受终端影响的环境中运行。
二、方法一:nohup 简单直接的一次性后台运行
nohup 是 “no hang up” 的缩写,它的核心作用就是让进程忽略 SIGHUP 信号。
基本用法
最常用的命令格式如下:
nohup 你的命令 > output.log 2>&1 &
我们来拆解一下这个命令:
nohup你的命令> output.log将命令的标准输出重定向到 output.log 文件。2>&1将命令的标准错误(2)也重定向到标准输出(1)所在的文件,即 output.log。这样,所有的输出和报错信息都会被记录下来,方便排查问题。&
实际操作示例
假设我们要运行一个名为 print.sh 的shell脚本:
执行后,终端会返回一个进程号(PID),并提示输出会写入 nohup.out 文件。此时,你就可以放心地关闭终端或断开 SSH 连接了,shell.sh 会一直在后台运行并每隔5s打印一行“hello world”。退出当前会话,重新远程连接,任务依然在运行。
查看与管理
- 查看输出使用
tail -f nohup.out 可以实时查看程序的输出日志。 - 查找进程通过
ps -ef | grep print 可以找到后台进程的 PID。 - 终止进程
注意事项
- 如果忘记重定向输出,
nohup 默认会将输出保存到当前目录下的 nohup.out 文件中。 nohup不会自动
三、方法二:screen 功能强大的会话管家
如果说 nohup 是“一锤子买卖”,那么 screen 就是一个功能强大的终端复用器(Terminal Multiplexer)。它创建一个虚拟终端会话,你可以随时分离(Detach)这个会话,让它安静地在后台运行,之后又可以随时重新连接(Reattach)回来,仿佛从未离开过。
安装 screen
大多数 Linux 发行版默认没有安装 screen,需要手动安装:
- CentOS / RHEL / Fedora
- 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。 - 重新连上服务器,执行
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 后台任务。
往期精彩推荐
Linux操作系统-centos7如何离线安装桌面环境
Linux操作系统-升级OpenSSH修复漏洞
Linux操作系统-tcpdump抓包定位网络问题实战
Linux操作系统-免交互远程登录操作系统