引言

tmux 简介
tmux 是一个终端复用器,允许用户在一个终端会话中管理多个终端会话。用户可以在一个窗口中分割多个面板、创建多个窗口、以及在不同会话之间切换。更重要的是,它可以在会话分离后继续运行任务,并在会话重新连接时恢复原来的状态(正如我们在开篇中的视频里展现的那样)。这使得它非常适合需要同时处理多个任务和长时间运行任务的用户。
配置远程终端服务
rt-smart 已经支持基于 dropbear 的ssh 服务器,从而可以使用主机电脑用ssh远程登录来使用板端smart操作系统。
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-smart/introduction/rt-smart-experiences/rt-smart-experiences?id=%e6%8a%a2%e5%85%88%e9%a2%84%e8%a7%88
smart上手体验 (rt-thread.org)
从以上链接可以获取 smart-prebuild预构建镜像。使用 prebuilt 版本启动系统后,可以在 /etc/inittab中看到如下内容:
其中含有dropbear的启动命令/bin/dropbear -f 2>/root/dropbear.log,故系统启动时自动启动dropbear ssh服务器。qemu启动脚本则将qemu的22号端口映射到主机58080端口。
新建tmux 会话与脱离
第一个启动的 tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。当然,使用编号区分会话不太直观。因此我们也可以为会话起名,便于记忆。
tmux new-s <session-name>
使用上面的命令就可以创建一个指定名称的会话。下图展示了这个命令的使用。在创建会话后,我们可以如同普通 shell 那样在tmux 中执行命令。
此外,在执行脚本的过程中,按下ctrl+b d或者输入tmux detach -t <num>/<name>命令,就会将当前会话与窗口分离。但是会话和里面的进程仍然在后台运行。使用结果如同上图最后操作的那样,我们会看到 tmux 打印 “detached (from session test)”。同时,终端回到 shell 程序控制。
连接先前创建的 tmux 会话
tmux attach -t <num>/<name>
我们使用上面的命令接入先前创建的会话。这时终端回到原有的会话现场。这给我们检查之前创建的管道状态提供了巨大便利。
下图展示了会话创建后脱离并重新连接的过程:
我们先使用tmux new-s hello 命令创建了一个名为hello的会话,接着使用ctrl+b d 组合键将当前会话与窗口分离,接着又使用tmux attach -t hello接入hello会话现场。这时我们可以看到脚本仍在正常执行。
tmux switch -t <name>/<num>
此外,当我们创建了多个会话时,可以通过tmux switch 来切换不同的会话。这里以hello 为例子。
上图中可以看到成功切换到hello,里面的进程仍在运行
tmux rename-session -t <name> /<num> <new-name>
此外,我们还可以通过命令重命名已经创建的会话。
对于不想要的会话也可以通过tmux kill-session -t <name>/<num>来结束掉。当会话结束后,我们使用 tmux ls 命令就看不到 test2 会话了,并且也不能用attach再进行连接。
tmux 窗格管理
tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。以下命令都是在 tmux 窗口中执行。
● 使用tmux split-window可以划分上下两个窗格,tmux split-window -h可以划分为左右两个窗格。
● 窗格划分后,可以通过tmux select-pane -u/d/l/r 命令移动光标位置,或者使用快捷键 ctrl+b <arrow key>。
下面是窗格管理的快捷键使用大全:
ctrl+b %:划分左右两个窗格。
ctrl+b ":划分上下两个窗格。
ctrl+b <arrow key>:光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
ctrl+b ;:光标切换到上一个窗格。
ctrl+b o:光标切换到下一个窗格。
ctrl+b {:当前窗格与上一个窗格交换位置。
ctrl+b }:当前窗格与下一个窗格交换位置。
ctrl+b ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。
ctrl+b alt+o:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。
ctrl+b x:关闭当前窗格。
ctrl+b !:将当前窗格拆分为一个独立窗口。
ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
ctrl+b ctrl+<arrow key>:按箭头方向调整窗格大小。
ctrl+b q:显示窗格编号。`在这里插入代码片`
下面展示使用快捷键分割窗口和切换光标位置的过程:
tmux 窗口管理
除了将一个窗口划分成多个窗格,tmux 也允许新建多个窗口。我们可以使用 tmuxnew-window命令创建新窗口,通过tmux select-window -t <num> 命令用来切换窗口,通过tmux rename-window命令用于为当前窗口起名(或重命名)。
这些命令同样有快捷键替代:
ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
ctrl+b n:切换到下一个窗口。
ctrl+b <number>:切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号。
ctrl+b w:从列表中选择窗口。
ctrl+b ,:窗口重命名。
使用快捷键进行窗口的创建,切换,重命名过程如下:
同样如果想要关闭某个窗格可以使用ctrl+b x组合命令,这里不再演示
tmux 中使用 scp 实现安全文件传输
rtt内核用作ssh服务器,我们就可以通过scp来向其传输文件。以通过终端工具传输 mksd 脚本为例。我们首先配置好 rt-smart 服务器的地址和用户名,密码。然后可以直接拖动客户端操作系统上的文件到左侧文件系统视窗中。此时会自动建立 scp 进程完成文件拷贝。
在 tmux 背后是……
tmux 的这些强大功能依赖于操作系统的几个核心机制。首先是会话和进程组,tmux 利用这些机制来管理和组织不同的终端会话和进程。每个 tmux 会话可以包含多个窗口,而每个窗口又可以包含多个进程,这些进程被组织成进程组,以便统一管理。
其次,终端和伪终端是 tmux 实现多窗口和分割面板的基础。伪终端提供了一个虚拟终端设备,使得用户可以创建和管理多个虚拟终端,这些终端可以独立运行并显示各自的输出。
此外,tmux 是一个基于前后端架构的应用。前端负责用户输入和显示输出,而后端负责实际的任务管理和执行。前后端通信及异步事件处理也依赖于 libevent 库。libevent 是一个轻量级的事件驱动编程库,它基于 unix 域套接字(uds)、netlink 等基础设施,为进程间双工通信、多播和内核异步事件通知提供了高效的实现。这使得 tmux 能够在需要处理大量并发事件时,依然保持高效、稳定的运行。
信号处理也是 tmux 功能的关键部分。tmux 可以在会话分离和重新连接时通过内核提供的 sigcont、sigstop 等posix 作业控制信号正确地管理和恢复进程状态,确保任务能够持续运行而不受干扰
上图总结了 tmux 在 rt-thread smart 的运行环境中的各类软硬件组件。它们保证了 rt-thread smart在多个方面为程序应用提供了便利和灵活。无论是进程间通信、与内核进行信息交换、还是通过netlink 处理异步事件,抑或是通过伪终端与终端仿真器进行交互,用户程序都能够更加轻松地操作系统,提高工作效率。rt-smart 系统提供的丰富系统组件为嵌入式开发带来了更多可能性,让我们在这个快速发展的技术世界中走得更快、更远。
结语
本文我们介绍了 rt-thread smart 系统在支持复杂应用方面的强大能力。从多窗口终端管理的 tmux 到远程登录的 ssh,rt-thread smart 展现了其在嵌入式开发中的灵活性和高效性。
希望通过本文,能够让更多的开发者了解并使用 rt-thread smart,在这个充满活力的平台上实现更多精彩的应用。让我们一起期待,在未来的嵌入式开发旅程中,rt-thread smart 将继续为我们带来更多惊喜和便利。
欢迎大家在 rt-thread github 仓库或论坛上向我们反馈意见和建议。另外,如果您对参与到 rt-thread 的平台支持(risc-v、arm、arm64 平台上的驱动、内核代码完善)、应用移植与开发、文档维护感兴趣,我们诚邀您加入 smart 兴趣小组,参与到与 smart 相关的开源贡献中。
最后是次回预告。我们计划在下一篇文章为大家分享 rt-thread smart 在多核平台上的实时性能表现。如果您感兴趣还请持续关注。
——————end——————


发表评论