让一个程序在后台运行

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的区别:

screentmux 都是用于创建持久化终端会话的工具,意思是你可以启动一个会话、运行一些命令,然后“分离”这个会话(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,分别叫做 01,它们包含了不同数量的窗口(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 然后 01 来切换

在窗口里你还可以按:

  • 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 简直是神器

你可能感兴趣的:(python,linux,网络)