Part I: 如何让一个程序在后台运行,在关闭终端的时候,命令或者进行不会被中断
在 Linux 上,如果你希望一个命令在后台持续运行,即使你关闭终端,它不会被终止,有几种常用的方法可以实现这个目的:
方法一:使用 nohup
nohup
(no hang up)命令可以让进程忽略挂起(HUP)信号,这样即使关闭终端也不会结束。
nohup your-command > output.log 2>&1 &
your-command
是你要运行的命令。> output.log
将标准输出写入output.log
文件。2>&1
表示将标准错误也重定向到标准输出。&
表示在后台运行。
示例:
nohup python3 my_script.py > my_script.log 2>&1 &
方法二:使用 screen
screen
是一个虚拟终端,可以让你创建多个持久化会话。
screen -S mysession
然后运行你的命令,比如:
python3 my_script.py
按下 Ctrl + A
,然后按 D
键就可以“分离”这个会话。
下次你可以用下面的命令重新连接:
screen -r mysession
方法三:使用 tmux
tmux
是另一个流行的终端复用工具,比 screen
更现代。
tmux new -s mysession
然后运行你的命令。退出会话同样可以用:
Ctrl + B 然后 D
重新连接:
tmux attach -t mysession
小贴士:查看后台运行的命令
可以用 jobs
, ps
, 或 pgrep
来查看:
jobs -l
ps aux | grep your-command
Part II: Screen与Tmux的区别:
screen
和 tmux
都是用于创建持久化终端会话的工具,意思是你可以启动一个会话、运行一些命令,然后“分离”这个会话(detach),即使你断开 SSH 或关闭终端,它们仍然运行。你可以稍后再“重新连接”(attach)回来继续。
下面是它们的主要区别和选择建议👇
🥊 screen
vs tmux
:对比表
特性 | screen | tmux |
---|---|---|
发布年代 | 1987年,老一代工具 | 2009年,更现代 |
多窗口支持 | 支持,但较基础 | 更强大、灵活的窗口/面板管理 |
分屏功能 | 有,但操作不便 | ✅ 强大分屏、面板功能 |
配置和扩展性 | 配置简单,扩展少 | 可配置性高,插件支持丰富 |
状态栏美观 | 简单粗糙 | ✅ 支持丰富主题和状态栏插件 |
易用性 | 更少快捷键,简单易上手 | 起初快捷键复杂,习惯后更强大 |
默认安装 | ✅ 通常预装在大多数 Linux 中 | 需要手动安装(但也很容易) |
🧠 如何选择?
✅ 选择 tmux
,如果你:
- 喜欢使用多个窗口/分屏同时操作多个任务。
- 需要一个可配置、现代化的界面。
- 想要使用插件(比如自动重连、主题、自定义快捷键等)。
- 需要开发、调试工作更舒适的终端体验。
✅ 选择 screen
,如果你:
- 只是想快速挂个脚本后台跑,不在意界面和分屏。
- 你的系统上已经预装了
screen
,不想装其他工具。 - 偶尔用一次,不想学习新快捷键。
🎮 快捷键对比示例
动作 | screen 快捷键 | tmux 快捷键 |
---|---|---|
分离会话 | Ctrl + A 然后 D | Ctrl + B 然后 D |
创建新窗口 | Ctrl + A 然后 C | Ctrl + B 然后 C |
切换窗口 | Ctrl + A 然后 N | Ctrl + B 然后 N |
分屏 | 有但较麻烦 | Ctrl + B 然后 % 或 " |
🛠 安装(如未安装):
安装 tmux
:
sudo apt install tmux # Debian/Ubuntu
sudo yum install tmux # CentOS/RHEL
brew install tmux # macOS
如果你是开发者或长期需要远程操作,强烈建议用 tmux
。
如果你只是偶尔远程执行脚本,screen
就足够了。
Part III: tmux常用的命令
在 tmux
中,“挂起的窗口” 实际上是指你已经创建但当前没有 attach 的 session
(也可以理解为“终端工作区”)。下面是查看和管理这些 session 和窗口的方法 👇
🧭 查看所有挂起的 tmux session
tmux ls
或者
tmux list-sessions
输出示例:
0: 1 windows (created Sun Apr 21 10:00:00 2024) [80x24]
1: 3 windows (created Sun Apr 21 11:00:00 2024) [80x24]
上面的例子说明你有两个 session,分别叫做 0
和 1
,它们包含了不同数量的窗口(window)。
🔍 查看某个 session
中有哪些窗口
进入某个 session:
tmux attach -t 1
然后你可以使用快捷键查看窗口:
- 列出所有窗口:看底部状态栏(每个窗口名字 + 编号)
- 切换窗口:
Ctrl + B
然后N
(Next window)Ctrl + B
然后P
(Previous window)Ctrl + B
然后窗口编号(例如1
,2
)
你也可以用命令行查看窗口信息(无需 attach):
tmux list-windows -t 1
示例输出:
0: bash* (1 panes) [80x24]
1: vim (1 panes) [80x24]
2: logs (1 panes) [80x24]
🧼 查看所有 pane
(分屏)信息
如果你想更详细地看到每个窗口下的分屏(pane):
tmux list-panes -t 1
📌 总结常用命令
目标 | 命令 |
---|---|
查看所有 tmux session | tmux ls |
查看某 session 的窗口 | tmux list-windows -t name |
查看某窗口的所有 pane | tmux list-panes -t session:window |
进入某 session | tmux attach -t name |
如果你有很多 session 还可以给它们起个名字,这样更容易管理:
tmux new -s myproject
然后用:
tmux attach -t myproject
Part IV: 如何理解tmux中的session和窗口的概念
理解 tmux
的核心概念是上手和用得溜的关键。tmux
主要有三个核心层级:Session(会话)、Window(窗口)、Pane(面板)。我们来用类比和例子解释一下:
🧠 简单理解:tmux 的“层级关系”
Session(会话)
└── Window(窗口)
└── Pane(面板)
💡 类比记忆法:tmux = 多层办公桌
🏢 Session = 办公桌
每个 Session 是一个独立的“工作环境”,你可以想象是你的一张桌子(或者一个“项目”)。你可以有多个 session 来分别处理不同任务(比如一个编程项目,一个日志查看项目等)。
📄 Window = 文件夹
在这张桌子上,你可以打开很多文件夹(每个文件夹里可以是一个 bash 窗口、vim 编辑器、python 脚本等)。这些就是 tmux 的“窗口”。
🔲 Pane = 拆页/分格
你可以把一个“窗口”拆成多个“格子”显示多个命令行视图,比如左边 tail 日志,右边 top 监控 CPU。
👀 实际例子
比如你启动了一个 session:
tmux new -s dev
你现在就在 dev
这个 session 里,默认会自动打开一个 window(编号为 0)。你可以在里面干一件事,比如运行服务器。
然后你可以按:
Ctrl + B
然后C
→ 创建新窗口(相当于打开了另一个终端界面)- 每个窗口都有自己的编号,比如
0
,1
,2
,你可以用Ctrl + B
然后0
、1
来切换
在窗口里你还可以按:
Ctrl + B
然后"
→ 水平分屏Ctrl + B
然后%
→ 垂直分屏
📋 命令和快捷键回顾
概念 | 作用 | 常用命令 / 快捷键 |
---|---|---|
Session | 独立的工作空间 | tmux new -s name / tmux ls |
Window | 每个 session 中的“标签页” | Ctrl + B 然后 C / N / P |
Pane | 每个 window 中的分屏 | Ctrl + B 然后 " / % |
🧭 你可以这样组织你的 tmux:
Session: dev
├── Window 0: vim app.py
├── Window 1: python server.py
└── Window 2: tail logs
Session: ops
└── Window 0: top, htop, ping(多个 panes)
如果你经常做多任务操作,比如一边写代码一边看日志,tmux 简直是神器。