AIStudio SSH 公钥管理,一处配置,处处可用AIStudio SSH 公钥管理,一处配置,处处可用 ,只为更佳开发体验如何配置
Skip to content
回到全部文章

Linux 后台运行入门指南:掌握 nohup、tmux 和 screen

在 Linux 系统中,我们经常需要在终端运行一些需要较长时间才能完成的任务,例如:

  • 下载大文件
  • 运行服务器程序
  • 执行数据备份
  • 编译大型项目

如果我们直接在前台运行这些命令,终端就会被占用,直到命令执行完成才能继续输入其他命令。而且,一旦关闭终端窗口或者 SSH 连接断开,正在运行的程序也可能会被终止。

为了解决这些问题,Linux 提供了 后台运行 的技术,让命令在后台默默执行,不占用前台终端,并且在终端关闭后也能继续运行。

本教程将介绍三种常用的 Linux 后台运行方式:nohup + &tmuxscreen,并结合简单实例进行讲解。

nohup + &:简单粗暴的后台运行

nohup& 是两个独立的命令或符号,但它们经常一起使用,构成最基础的后台运行方式。

  • & (后台运行符号): 在命令末尾加上 & 符号,可以将命令放到 后台 运行。这意味着命令会在后台进程中执行,而你的终端会立即释放出来,可以继续输入其他命令。

  • nohup (忽略挂断信号)nohup 是 "no hang up" 的缩写,它的作用是让命令 忽略 hangup 信号。 hangup 信号通常在终端关闭或 SSH 连接断开时发送给正在运行的进程。 使用 nohup 可以防止程序因为终端关闭而终止。

nohup command & 的组合效果: 将 command 命令放到后台运行,并且忽略 hangup 信号,即使关闭终端,命令也能继续运行。

简单实例:使用 nohup + & 运行 sleep 命令

sleep 命令可以让程序暂停指定的时间(单位为秒)。我们用它来模拟一个长时间运行的任务。

  1. 执行命令: 在终端输入以下命令并回车:

    bash
    nohup sleep 60 &
    • nohup sleep 60: 使用 nohup 运行 sleep 60 命令,让程序暂停 60 秒。
    • &: 将整个 nohup sleep 60 命令放到后台运行。
  2. 查看输出: 执行命令后,你会看到类似以下输出:

    [1] 1234
    nohup: ignoring input and appending output to 'nohup.out'
    • [1] 1234: [1] 是作业号,1234 是后台进程的 PID (进程 ID)。
    • nohup: ignoring input and appending output to 'nohup.out': 这是 nohup 命令的提示信息,告诉你它忽略输入,并将输出追加到当前目录下的 nohup.out 文件中。
  3. 终端操作: 此时,你的终端已经释放出来,你可以继续输入其他命令,而 sleep 60 命令仍然在后台运行。 你可以关闭当前终端窗口,sleep 60 命令依然会继续执行 60 秒。

  4. 查看输出文件: 60 秒后,sleep 60 命令执行完毕。由于我们没有让 sleep 命令产生任何输出,所以 nohup.out 文件通常是空的 (或者只包含一些 nohup 的启动信息)。 但如果你的命令有标准输出或标准错误输出,这些信息都会被记录到 nohup.out 文件中。

nohup + & 的优点和局限性:

  • 优点

    • 简单易用: 使用方法非常简单,只需在命令前加 nohup,命令后加 &
    • 系统资源消耗小: nohup 本身非常轻量级,对系统资源消耗很小。
    • 广泛适用: 几乎所有 Linux 系统都默认安装了 nohup 命令。
  • 局限性

    • 会话不可恢复: 一旦终端关闭,就无法直接查看后台进程的运行状态和输出信息(需要查看 nohup.out 文件或使用 ps 命令)。
    • 没有终端管理功能: 只能运行单个后台进程,无法在一个终端窗口中管理多个会话或窗口。
    • 不适合需要交互的程序: 由于忽略输入,nohup 不适合运行需要用户交互的程序。

何时使用 nohup + &

当你只需要简单地将一个 不需要交互 的命令放到后台运行,并且 不关心会话恢复和终端管理 时,nohup + & 是一个方便快捷的选择。 例如,运行一些简单的后台脚本,或者启动一个不需要持续监控的后台服务。

tmux:强大的终端会话管理器

tmux (Terminal Multiplexer) 是一个 终端复用器,它不仅可以实现后台运行,更强大的功能是 会话管理tmux 允许你:

  • 创建持久化的会话: 即使关闭终端窗口或 SSH 连接断开,tmux 会话仍然在后台运行,其中的程序也继续运行。
  • 在一个终端窗口中管理多个窗口和面板: 可以将一个终端窗口分割成多个独立的窗口和面板,方便同时进行多项任务。
  • 会话共享: 允许多个用户连接到同一个 tmux 会话,进行协作或查看相同的终端界面。

tmux 的核心概念:

  • Session (会话)tmux 的最顶层概念,一个 tmux 服务器可以管理多个会话。每个会话都是相互独立的。
  • Window (窗口): 每个会话可以包含多个窗口,类似于浏览器中的标签页。
  • Pane (面板): 每个窗口可以分割成多个面板,每个面板都是一个独立的终端。

简单实例:使用 tmux 运行 top 命令

top 命令可以实时显示系统中各个进程的资源占用情况。

  1. 创建 tmux 会话: 在终端输入以下命令并回车,创建一个名为 mytmux 的新 tmux 会话:

    bash
    tmux new-session -s mytmux

    或者,你也可以直接输入 tmuxtmux new 创建一个默认名称的会话。

  2. 运行 top 命令: 在 tmux 会话的窗口中,输入 top 命令并回车。 你会看到 top 命令开始实时刷新系统进程信息。

  3. 分离 tmux 会话 (放到后台): 按下快捷键 Ctrl + b,然后按下 d 键。 这会将当前的 tmux 会话 分离 (detach),回到普通的终端提示符。 此时,top 命令仍然在 tmux 会话中 后台运行

  4. 关闭终端窗口 (可选): 你可以安全地关闭当前的终端窗口,tmux 会话和 top 命令依然会在后台运行。

  5. 重新连接 tmux 会话: 稍后,当你重新打开终端或重新连接 SSH 后,可以使用以下命令 重新连接 (attach) 到名为 mytmuxtmux 会话:

    bash
    tmux attach-session -t mytmux

    或者,如果只有一个 tmux 会话在运行,可以直接使用 tmux attachtmux a

    重新连接后,你会看到之前的 tmux 会话界面,top 命令仍然在运行,并且终端状态完全恢复到分离之前的样子。

  6. 退出 tmux 会话 (并终止 top 命令): 在 tmux 会话中,输入 exit 命令并回车,可以终止 top 命令并关闭当前的 tmux 窗口。 如果想完全退出 tmux 会话,可以继续输入 exit 命令,直到 tmux 会话关闭。 或者使用快捷键 Ctrl + d 关闭窗口和会话。

常用的 tmux 命令和快捷键:

  • tmux new-session -s <session-name>: 创建新的 tmux 会话,并指定会话名称。
  • tmux attach-session -t <session-name>: 重新连接到已存在的 tmux 会话。
  • tmux ls: 列出当前正在运行的 tmux 会话。
  • Ctrl + b d: 分离 (detach) 当前 tmux 会话。 (先按住 Ctrl 键和 b 键,然后松开,再按下 d 键。 Ctrl + btmux 的默认快捷键前缀,所有 tmux 命令都需要先按这个前缀。)
  • Ctrl + b c: 在当前会话中创建新的窗口 (window)。
  • Ctrl + b n: 切换到下一个窗口 (next window)。
  • Ctrl + b p: 切换到上一个窗口 (previous window)。
  • Ctrl + b %: 将当前窗口水平分割成两个面板 (pane)。
  • Ctrl + b ": 将当前窗口垂直分割成两个面板 (pane)。
  • Ctrl + b 方向键 (↑↓←→): 在面板之间切换。
  • Ctrl + b x: 关闭当前面板。
  • Ctrl + b &: 关闭当前窗口。
  • exit: 在 tmux 窗口或面板中输入 exit 可以关闭当前窗口或面板(如果只剩一个窗口,则会关闭会话)。

tmux 的优点和局限性:

  • 优点

    • 强大的会话持久性: 即使终端关闭,tmux 会话依然存在,程序持续运行,并且可以随时恢复会话。
    • 优秀的终端管理: 提供窗口和面板功能,在一个终端窗口中高效管理多个任务。
    • 会话共享和协作: 支持多人共享同一个 tmux 会话,方便协作和远程协助。
    • 高度可定制: 可以自定义快捷键、界面风格等。
  • 局限性

    • 学习曲线稍陡峭: 相对于 nohup + &tmux 的命令和快捷键较多,需要一定的学习成本。
    • 需要安装: 通常需要手动安装 tmux (sudo apt install tmuxsudo yum install tmuxbrew install tmux 等)。

何时使用 tmux

当你需要 持久化会话终端管理会话共享 等高级功能时,tmux 是最佳选择。 例如:

  • 长时间运行开发环境
  • 远程服务器管理
  • 需要同时进行多项终端任务
  • 需要与他人协作进行终端操作

screen: 历史悠久的终端复用器

screen 是另一个流行的终端复用器,功能上与 tmux 类似,但比 tmux 历史更悠久。 在 tmux 出现之前,screen 是 Linux 系统中最常用的终端会话管理工具。

screen 的核心概念和功能与 tmux 类似

会话 (session)、窗口 (window)。 它也允许你创建持久化会话,在一个终端窗口中管理多个窗口。

简单实例:使用 screen 运行 ping 命令

ping 命令用于测试网络连接。

  1. 创建 screen 会话: 在终端输入以下命令并回车,创建一个新的 screen 会话:

    bash
    screen -S myscreen

    或者,直接输入 screen 创建一个默认名称的会话。

  2. 运行 ping 命令: 在 screen 会话的窗口中,输入 ping baidu.com 命令并回车。 ping 命令会持续发送网络包并显示结果。

  3. 分离 screen 会话 (放到后台): 按下快捷键 Ctrl + a,然后按下 d 键。 这会将当前的 screen 会话 分离 (detach),回到普通的终端提示符。 ping baidu.com 命令仍然在 screen 会话中 后台运行

  4. 关闭终端窗口 (可选): 可以关闭终端窗口,screen 会话和 ping 命令依然会在后台运行。

  5. 重新连接 screen 会话: 稍后,重新打开终端或 SSH 连接后,可以使用以下命令 重新连接 (reattach) 到名为 myscreenscreen 会话:

    bash
    screen -r myscreen

    或者,如果只有一个 screen 会话在运行,可以使用 screen -rscreen -a -r

    重新连接后,你会看到之前的 screen 会话界面,ping baidu.com 命令仍然在运行。

  6. 退出 screen 会话 (并终止 ping 命令): 在 screen 会话中,按下快捷键 Ctrl + c 可以终止 ping 命令。 输入 exit 命令并回车,可以关闭当前的 screen 窗口。 再次输入 exit 命令,直到 screen 会话关闭。 或者使用快捷键 Ctrl + d 关闭窗口和会话。

常用的 screen 命令和快捷键:

  • screen -S <session-name>: 创建新的 screen 会话,并指定会话名称。
  • screen -r <session-name>: 重新连接到已存在的 screen 会话。
  • screen -lsscreen -list: 列出当前正在运行的 screen 会话。
  • Ctrl + a d: 分离 (detach) 当前 screen 会话。 (Ctrl + ascreen 的默认快捷键前缀。)
  • Ctrl + a c: 在当前会话中创建新的窗口 (window)。
  • Ctrl + a n: 切换到下一个窗口 (next window)。
  • Ctrl + a p: 切换到上一个窗口 (previous window)。
  • Ctrl + a ": 显示窗口列表,方便窗口切换。
  • Ctrl + a k: 杀死 (kill) 当前窗口。
  • exit: 在 screen 窗口中输入 exit 可以关闭当前窗口(如果只剩一个窗口,则会关闭会话)。

screen 的优点和局限性:

  • 优点

    • 会话持久性: 与 tmux 类似,提供持久化会话功能。
    • 终端管理: 提供窗口功能,在一个终端窗口中管理多个任务。
    • 广泛兼容性: screen 历史悠久,通常预装在各种 Linux 和 Unix 系统中,兼容性更好。
  • 局限性

    • 功能相对较弱: 相比 tmuxscreen 的功能相对较少,例如面板分割、会话共享等方面不如 tmux 强大。
    • 快捷键操作略有不同: screen 的快捷键前缀是 Ctrl + a,与 tmuxCtrl + b 不同,需要适应。
    • 界面和用户体验相对较旧: screen 的界面和用户体验相对 tmux 较为陈旧。

何时使用 screen

screentmux 的适用场景非常相似。 如果你需要 持久化会话基本的终端管理功能screen 也是一个不错的选择。 在一些较老的 Linux 系统或者 Unix 系统中,screen 可能会是默认安装的终端复用器,这时使用 screen 会更方便。

后台运行方式对比表格

特性nohup + &tmux / screen
功能侧重进程分离,和输出重定向终端会话管理,和持久化
主要目的让命令在后台运行,不受终端关闭影响,并将输出保存到文件创建和管理持久化的终端会话,命令在会话中运行,会话可以随时重新连接
会话持久性有限的会话持久性。命令在后台运行,但没有会话管理的概念。强大的会话持久性。即使终端关闭,tmux/screen 会话仍然存在,其中的程序继续运行。
会话恢复无法恢复会话。一旦终端关闭,就无法再直接查看或操作后台进程 (除非使用 ps 等命令)。可以随时重新连接会话。即使终端关闭,之后可以重新连接到 tmux/screen 会话,恢复之前的终端状态,包括正在运行的程序,和终端布局。
终端管理不提供终端管理功能。只有一个后台进程,没有窗口或面板的概念。提供终端管理功能。都可以在一个会话中创建多个窗口,方便管理多个终端任务。 tmux 还可以分割窗口为面板。
会话共享不支持会话共享支持会话共享。多个用户可以连接到同一个 tmux/screen 会话,进行协作或查看同一个终端界面。 screen 的会话共享需要额外配置,功能相对有限。
安装需求通常内置于 Unix/Linux 系统,无需额外安装。tmux: 需要手动安装 (apt install tmux,yum install tmux,brew install tmux 等)。 screen: 通常预装,或需手动安装。
复杂性简单易用,基本命令即可实现后台运行。功能相对复杂,学习曲线适中。需要学习 tmux/screen 的命令和操作方式。 tmux 的功能更强大,学习曲线稍陡峭。
输出查看输出默认重定向到 nohup.out 文件。需要查看文件才能获取输出。可以在 tmux/screen 会话的终端窗口中实时查看输出,也可以将输出保存到文件。

选择哪种后台运行方式?

  • nohup + &: 简单快捷,适合简单的后台任务,不需要会话管理。
  • tmux: 功能强大,提供优秀的会话持久性、终端管理和会话共享功能,适合需要复杂终端操作和长时间运行的任务。 是目前更流行和推荐的终端复用器。
  • screen: 功能与 tmux 类似,但相对较旧,功能稍弱,但在一些老旧系统中可能更常见。 如果你已经熟悉 screen 或者系统默认安装了 screen,也可以使用它。

建议: 对于大多数场景,推荐学习和使用 tmux。 虽然 tmux 学习曲线稍高,但它提供的强大功能和优秀的用户体验,会让你在 Linux 终端操作中更加高效和便捷。 nohup + & 可以作为备选方案,用于简单的后台任务。 screen 可以作为了解终端复用器概念的入门工具,或者在特定环境下使用。