Linux 后台运行入门指南:掌握 nohup、tmux 和 screen
在 Linux 系统中,我们经常需要在终端运行一些需要较长时间才能完成的任务,例如:
- 下载大文件
- 运行服务器程序
- 执行数据备份
- 编译大型项目
如果我们直接在前台运行这些命令,终端就会被占用,直到命令执行完成才能继续输入其他命令。而且,一旦关闭终端窗口或者 SSH 连接断开,正在运行的程序也可能会被终止。
为了解决这些问题,Linux 提供了 后台运行 的技术,让命令在后台默默执行,不占用前台终端,并且在终端关闭后也能继续运行。
本教程将介绍三种常用的 Linux 后台运行方式:nohup + &
、tmux
和 screen
,并结合简单实例进行讲解。
nohup + &
:简单粗暴的后台运行
nohup
和 &
是两个独立的命令或符号,但它们经常一起使用,构成最基础的后台运行方式。
&
(后台运行符号): 在命令末尾加上&
符号,可以将命令放到 后台 运行。这意味着命令会在后台进程中执行,而你的终端会立即释放出来,可以继续输入其他命令。nohup
(忽略挂断信号):nohup
是 "no hang up" 的缩写,它的作用是让命令 忽略 hangup 信号。 hangup 信号通常在终端关闭或 SSH 连接断开时发送给正在运行的进程。 使用nohup
可以防止程序因为终端关闭而终止。
nohup command &
的组合效果: 将 command
命令放到后台运行,并且忽略 hangup 信号,即使关闭终端,命令也能继续运行。
简单实例:使用 nohup + &
运行 sleep
命令
sleep
命令可以让程序暂停指定的时间(单位为秒)。我们用它来模拟一个长时间运行的任务。
执行命令: 在终端输入以下命令并回车:
bashnohup sleep 60 &
nohup sleep 60
: 使用nohup
运行sleep 60
命令,让程序暂停 60 秒。&
: 将整个nohup sleep 60
命令放到后台运行。
查看输出: 执行命令后,你会看到类似以下输出:
[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
文件中。
终端操作: 此时,你的终端已经释放出来,你可以继续输入其他命令,而
sleep 60
命令仍然在后台运行。 你可以关闭当前终端窗口,sleep 60
命令依然会继续执行 60 秒。查看输出文件: 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
命令可以实时显示系统中各个进程的资源占用情况。
创建
tmux
会话: 在终端输入以下命令并回车,创建一个名为mytmux
的新tmux
会话:bashtmux new-session -s mytmux
或者,你也可以直接输入
tmux
或tmux new
创建一个默认名称的会话。运行
top
命令: 在tmux
会话的窗口中,输入top
命令并回车。 你会看到top
命令开始实时刷新系统进程信息。分离
tmux
会话 (放到后台): 按下快捷键Ctrl + b
,然后按下d
键。 这会将当前的tmux
会话 分离 (detach),回到普通的终端提示符。 此时,top
命令仍然在tmux
会话中 后台运行。关闭终端窗口 (可选): 你可以安全地关闭当前的终端窗口,
tmux
会话和top
命令依然会在后台运行。重新连接
tmux
会话: 稍后,当你重新打开终端或重新连接 SSH 后,可以使用以下命令 重新连接 (attach) 到名为mytmux
的tmux
会话:bashtmux attach-session -t mytmux
或者,如果只有一个
tmux
会话在运行,可以直接使用tmux attach
或tmux a
。重新连接后,你会看到之前的
tmux
会话界面,top
命令仍然在运行,并且终端状态完全恢复到分离之前的样子。退出
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 + b
是tmux
的默认快捷键前缀,所有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 tmux
,sudo yum install tmux
,brew install tmux
等)。
- 学习曲线稍陡峭: 相对于
何时使用 tmux
?
当你需要 持久化会话、终端管理、会话共享 等高级功能时,tmux
是最佳选择。 例如:
- 长时间运行开发环境
- 远程服务器管理
- 需要同时进行多项终端任务
- 需要与他人协作进行终端操作
screen
: 历史悠久的终端复用器
screen
是另一个流行的终端复用器,功能上与 tmux
类似,但比 tmux
历史更悠久。 在 tmux
出现之前,screen
是 Linux 系统中最常用的终端会话管理工具。
screen
的核心概念和功能与 tmux
类似
会话 (session)、窗口 (window)。 它也允许你创建持久化会话,在一个终端窗口中管理多个窗口。
简单实例:使用 screen
运行 ping
命令
ping
命令用于测试网络连接。
创建
screen
会话: 在终端输入以下命令并回车,创建一个新的screen
会话:bashscreen -S myscreen
或者,直接输入
screen
创建一个默认名称的会话。运行
ping
命令: 在screen
会话的窗口中,输入ping baidu.com
命令并回车。ping
命令会持续发送网络包并显示结果。分离
screen
会话 (放到后台): 按下快捷键Ctrl + a
,然后按下d
键。 这会将当前的screen
会话 分离 (detach),回到普通的终端提示符。ping baidu.com
命令仍然在screen
会话中 后台运行。关闭终端窗口 (可选): 可以关闭终端窗口,
screen
会话和ping
命令依然会在后台运行。重新连接
screen
会话: 稍后,重新打开终端或 SSH 连接后,可以使用以下命令 重新连接 (reattach) 到名为myscreen
的screen
会话:bashscreen -r myscreen
或者,如果只有一个
screen
会话在运行,可以使用screen -r
或screen -a -r
。重新连接后,你会看到之前的
screen
会话界面,ping baidu.com
命令仍然在运行。退出
screen
会话 (并终止ping
命令): 在screen
会话中,按下快捷键Ctrl + c
可以终止ping
命令。 输入exit
命令并回车,可以关闭当前的screen
窗口。 再次输入exit
命令,直到screen
会话关闭。 或者使用快捷键Ctrl + d
关闭窗口和会话。
常用的 screen
命令和快捷键:
screen -S <session-name>
: 创建新的screen
会话,并指定会话名称。screen -r <session-name>
: 重新连接到已存在的screen
会话。screen -ls
或screen -list
: 列出当前正在运行的screen
会话。Ctrl + a
d
: 分离 (detach) 当前screen
会话。 (Ctrl + a
是screen
的默认快捷键前缀。)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 系统中,兼容性更好。
- 会话持久性: 与
局限性:
- 功能相对较弱: 相比
tmux
,screen
的功能相对较少,例如面板分割、会话共享等方面不如tmux
强大。 - 快捷键操作略有不同:
screen
的快捷键前缀是Ctrl + a
,与tmux
的Ctrl + b
不同,需要适应。 - 界面和用户体验相对较旧:
screen
的界面和用户体验相对tmux
较为陈旧。
- 功能相对较弱: 相比
何时使用 screen
?
screen
和 tmux
的适用场景非常相似。 如果你需要 持久化会话 和 基本的终端管理功能,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
可以作为了解终端复用器概念的入门工具,或者在特定环境下使用。