在 Linux 服务器上工作,我们经常会遇到这样的场景:通过 SSH 远程连接到服务器,启动了一个耗时的训练任务或数据拷贝,但网络不稳定或需要关闭电脑时,任务就跟着终端一起中断了。如何让程序在终端关闭后依然稳定运行,是每个 Linux 用户的必修课。

本文将详细介绍两种最常用的方法:nohupscreen,并通过对比帮你选择最合适的方案。

一、为什么终端关闭,程序就没了?

在 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 / Fedorayum install -y screen
  • Ubuntu / Debianapt-get install -y screen

核心用法

screen 的使用主要围绕以下几个命令:

  1. 创建会话screen -S mysession
    这会创建一个名为 mysession 的新会话,并自动进入。

  2. 在会话中运行程序:进入会话后,就像在一个正常的终端中一样,运行你的命令即可。

  3. 分离会话:在会话中,同时按下 Ctrl + A,然后按 D 键。
    你会立即回到原来的终端,而 screen 会话及其中的所有程序都在后台继续运行。

  4. 查看会话列表screen -ls
    这会列出所有处于 Attached(已连接)或 Detached(已分离)状态的会话。

  5. 恢复会话screen -r mysession
    这会重新连接到名为 mysession 的会话,你将回到之前的工作现场。

实际操作示例

  1. 创建一个名为 session.1 的会话:screen -S session.1
  2. 在会话里运行shell命令:while true;do echo 'hello world';sleep 5 ;done
  3. Ctrl + A,再按 D 分离会话。
  4. 断开 SSH 连接。
  5. 重新连上服务器,执行 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 是更专业、更强大的工具。

掌握 nohupscreen,能让你在面对长时间运行的任务时更加从容,不再担心网络波动或意外断连。希望这篇博客能帮助你更好地管理 Linux 后台任务。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐