Linux笔记:终端复用与管理工具screen和tmux

2023-11-18

目的

通过终端使用Linux时比较纠结的是一个终端通常同一时间只能做一件事,虽然可以将任务放入后台,但是对于有输出或交互的任务放入后台并不是一个好的选择。另一个比较纠结的问题是任务无法脱离终端运行,如果使用基础的命令使其脱离后台运行,下次就没法在终端中交互管理该任务了。

对于上面这些问题一般使用screen和tmux等终端复用与管理工具来处理,这篇文章将对相关内容进行说明。

很多新手经常碰到的问题就是按照网上的教程组了个服务器,然后安装运行了某些服务器软件,比如网站服务器、游戏服务器这些,然后退出终端后服务器就不工作了。使用screen和tmux这些工具就能很好的解决这个问题。

screen

快速入门

  • 安装
    在Debian和Ubuntu等系统中可以使用下面命令安装screen:
    sudo apt install screen
  • 创建新会话
    screen 创建新会话并进入;
    screen -S name 创建一个名为name的会话并进入;(推荐做法)
  • 退出会话
    在screen创建的会话中依次按下键盘 ctrl + a ctrl + d 或者 ctrl + a d 退出当前会话;
  • 列出已创建的会话
    使用 screen -ls 可以列出已创建的会话,分别显示pid号、会话名称、创建时间、状态(Detached-分离、Attached-连接);
  • 重新进入会话
    screen -r pid 使用pid号重新进入;
    screen -r name 使用会话名称重新进入;
    如果已经在一个会话中想要换到另一个会话,选项可以使用 -d -r
  • 关闭会话
    在screen创建的会话中可以依次按下键盘 ctrl + a k 关闭当前会话,也可以输入exit命令来关闭;

在这里插入图片描述

screen在创建后还可以不在当前会话中通过名称或编号直接传递指令运行,这个通常用于编写脚本使用:

#!/bin/bash

# 会话名
screen_name="screen_name"
screen -dmS $screen_name

# 要运行的命令
cmd="top";

# 向指定的会话传输内容(注意最后的回车使命令生效)
screen -x -S $screen_name -p 0 -X stuff "$cmd\n"

# 可以使用下面方式关闭会话
screen -x -S $screen_name -p 0 -X quit

更多介绍

其它常用选项:

选项 描述
-d 将指定的会话从终端分离 置为Detached
-R 重新进入会话 若没有该会话则新建会话
-wipe 列出已创建的会话 并清除状态为dead的会话

其它常用键绑定:

键绑定 描述
ctrl + a ? 查询所有键绑定
ctrl + a x 锁定当前会话

更多内容可以参考 man screen 或是下面链接:
https://www.gnu.org/software/screen/

tmux

快速入门

tmux基础功能和screen差不多,但是目前来说tmux总体上比screen更加好用些。

  • 安装
    在Debian和Ubuntu等系统中可以使用下面命令安装tmux:
    sudo apt install tmux
  • 创建新会话
    tmux 创建新会话并进入;
    tmux new -s name 创建一个名为name的会话并进入;(推荐做法)
    tmux创建的会话会在底部依次显示会话名、窗口名、主机名、时间等信息;
  • 退出会话
    在tmux创建的会话中依次按下键盘 ctrl + b d 退出当前会话;
  • 列出已创建的会话
    使用 tmux ls 可以列出已创建的会话,会话名称、会话含有的窗口数、创建时间;
    如果已经在tmux创建的会话中的话也可以依次按下键盘 ctrl + b s 进行查看,这个功能比较厉害,还可以预览各个会话的内容,并选择切换
  • 重新进入会话
    tmux a -t name 使用会话名称重新进入已存在的会话;
    如果已经在tmux创建的会话中的话也可以使用 tmux switch -t name 切换会话(没有 ctrl + b s 来的好用);
  • 关闭会话
    tmux kill-session -t name 使用会话名称关闭已有会话;
    如果已经在tmux创建的会话中的并且只有一个窗口和窗格的情况下可以按下键盘 ctrl + d 关闭当前会话;
  • 重命名会话
    tmux rename-session -t old-name new-name

在这里插入图片描述

要注意的是在tmux创建的会话中无法通过滚轮上下来查看历史信息,需要依次按下键盘上 ctrl + b PgUp ,接着就可以使用 PgUp PgDn 来查看历史信息了,按下 q 退出。

到目前位置tmux和前面的screen其实还是没有太大差别的,主要是快捷键、选项以及小部分操作上有些不同,真正区别大的是tmux的每个会话中还有窗口和窗格的概念。

窗口与窗格

一个tmux的会话中可以有多个窗口(window),每个窗口又可以分割成多个窗格(pane)。对窗口和窗格相关操作都是在会话中进行的。

  • 新建窗口
    在会话中依次按下键盘 ctrl + b c 创建新窗口;
    多个窗口下底部带*标记的为当前活动窗口;
  • 切换窗口
    ctrl + b w 列出所有窗口,可以预览并选择切换;
    ctrl + b 0 切换到0号窗口,依此类推;
    ctrl + b p 上一个窗口;
    ctrl + b n 下一个窗口;
  • 关闭窗口
    ctrl + b & 关闭当前窗口,会提示,按下y并回车确定;
    当前窗口只有一个窗格的情况下可以按下键盘 ctrl + d 关闭当前窗口;

在这里插入图片描述

如果把前面的会话看做是一个excel文件的话,那窗口就像是其中的一张张sheet。再接下去的窗格就开始魔幻了:

  • 新建窗格
    ctrl + b % 将当前窗口垂直分割;
    ctrl + b " 将当前窗口水平分割;
  • 切换窗格
    ctrl + b ctrl + b ctrl + b ctrl + b
  • 调整窗格
    ctrl + b space 依次切换窗格布局;
    ctrl + b { 当前窗格与上一个窗格交换位置;
    ctrl + b } 当前窗格与下一个窗格交换位置;
  • 缩放窗格
    ctrl + b z 当前窗格全屏显示,再使用一次会变回原来大小;
  • 拆分窗格
    ctrl + b ! 将当前窗格拆分为一个独立窗口;
  • 关闭窗格
    ctrl + b x 关闭当前窗口,会提示,按下y并回车确定;
    也可以按下键盘 ctrl + d 关闭当前窗口,不会提示;

在这里插入图片描述

更多介绍

tmux内容挺多的,更多内容可以参考 man tmux 或是下面链接:
https://github.com/tmux/tmux

tmux可以创建很多的会话、窗口、窗格,如果用的多的话在系统重启或崩溃的情况下一个个恢复就比较纠结了。针对这个情况甚至出了附加的工具来管理这些内容,参考如下:
https://tmuxp.git-pull.com/

总结

screen和tmux这类工具的出现给linux服务器的使用带来了很大的便利,借助这些工具你可以让所有工作都在前台跑着,或者随意换电脑登陆继续之前的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux笔记:终端复用与管理工具screen和tmux 的相关文章

  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 高效的内存屏障

    我有一个多线程应用程序 其中每个线程都有一个整数类型的变量 这些变量在程序执行期间递增 在代码中的某些点 线程将其计数变量与其他线程的计数变量进行比较 现在 我们知道在多核上运行的线程可能会无序执行 一个线程可能无法读取其他线程的预期计数器
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • Linux 上的基准测试程序

    对于一项任务 我们需要使用不同的优化和参数来对我们的实现进行基准测试 有没有一种可行的方法可以在Linux命令行 我知道时间 上使用不同的参数对小程序进行基准测试 从而为我提供CSV或类似内容的时间数据 输出可能类似于 Implementa
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • Awk - 计算两个文件之间的每个唯一值和匹配值

    我有两个文件 首先 我尝试获取第 4 列中每个唯一字段的计数 然后匹配第二个文件的第二列中的唯一字段值 File1 第 4 列的每个唯一值和 File2 第 2 列包含我需要在两个文件之间匹配的值 所以本质上 我试图 gt 如果 file2
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有
  • 如何从 C 程序中获取 NIC 详细信息?

    我想要获取连接到我的计算机的所有 NIC 的以下详细信息 1 接口名称 例如eth0 2 接口编号 如Windows http answers yahoo com question index qid 20080517041705AAOmJ
  • 为什么我的 Dockerfile CMD 不起作用?

    所以在我的 Dockerfile 的末尾我有这样的内容 WORKDIR home CMD django admin startproject whattt CMD bin bash 当我创建映像然后运行容器时 一切都按预期运行 没有错误 D
  • 使用 posix_spawn 启动进程

    我正在使用以下代码在 Linux 中启动新进程 pid t processID char argV 192 168 1 40 char 0 int status 1 status posix spawn processID home use

随机推荐