去年写过一篇 从Tmux 转到GNU Screen,理由是我可以 在两个显示器上通过PuTTY连接到同一个GNU Screen会话,但两个显示器可以显示不同的窗口(用GNU Screen的术语来说,是window和region),当时认为Tmux是做不到这一点的(如果两个PuTTY窗口attach到同一个会话,一个执行切换窗口的操作,另外一个PuTTY上面也会跟着切换,不能工作在不同窗口上),
但后来发现,其实Tmux支持类似的功能,不过文档中写得有点不太浅显明白.我也是碰到有文章讲这个才发现有这个功能的.
tmux 会话间共享窗口
Tmux实现这个功能依靠的概念是grouped sessions,也就是将建立两个会话(session)并将它们归并到同一个组,同一个组内的多个会话拥有同样的窗口(和窗口里面的pane),但各自有着不同的"当前窗口".创建组的方法是是在创建第二个session的时候用 -t target-session 将前一个session指定为新session的目标session:
new-session [-AdDP] [-c start-directory] [-F format] [-n window-name] [-s session-name]
[-t target-session] [-x width] [-y height] [shell-command]
(alias: new)
Create a new session with name session-name.
The new session is attached to the current terminal unless -d is given.
window-name and shell-command are the name of and shell command to
execute in the initial window. If -d is used, -x and -y specify the
size of the initial window (80 by 24 if not given).
If run from a terminal, any termios(4) special characters are saved and
used for new windows in the new session.
The -A flag makes new-session behave like attach-session if session-
name already exists; in the case, -D behaves like -d to attach-session.
If -t is given, the new session is grouped with target-session. This
means they share the same set of windows - all windows from target-
session are linked to the new session and any subsequent new windows or
windows being closed are applied to both sessions. The current and
previous window and any session options remain independent and either
session may be killed without affecting the other. Giving -n or shell-
command are invalid if -t is used.
The -P option prints information about the new session after it has
been created. By default, it uses the format ‘#{session_name}:’ but a
different format may be specified with -F.`
然后用 tmux list-sessions 就可以看到有两个session.
bamanzi@raspberrypi:~ $ tmux ls
1: 2 windows (created Tue Jun 27 13:51:20 2017) [204x52] (group 0)
3: 2 windows (created Tue Jun 27 13:59:19 2017) [204x52] (group 0) (attached)
可以看到这里两个会话都有 (group 0)
这个标识.
两个显示器(或者两个人)用 tmux attach -t <id>
分别attached到这两个不同的会话的话,两边可以各自查看不同的窗口.
解决窗口尺寸的问题
不过相对GNU Screen而言,这里还是有个不爽的地方,两个tmux会话之间窗口(window)大小会相互影响:比如一个PuTTY是132x55的,另一个是140x50的,当只有一个session连上来的时候,tmux会将窗口尺寸调整到跟当前PuTTY一致,但组内另外一个窗口连上来的时候,window的大小跟会跟两个屏幕的公共部分一样大了(变成132x50)--这跟同一个tmux session的情况是一样的.
而GNU Screen的设计不太一样,屏幕尺寸是不相互影响的,连region分隔也不相互影响.我们可以在一个PuTTY窗口上显示窗口3和5(GNU Screen的窗口比较类似于Tmux的pane),在另一个PuTTY窗口上显示窗口1, 2和4.窗口大小完全相互不影响--不过它有个烦人的地方,将一个窗口放到当前region来现实的时候,要用C-a F (fit) 调整一下该程序的终端大小,使其跟当前region大小一致.
tmux 提供了一个选项来解决(部分解决)这个问题:
aggressive-resize [on | off]
Aggressively resize the chosen window. This means that tmux will resize the window to
the size of the smallest session for which it is the current window, rather than the
smallest session to which it is attached. The window may resize when the current
window is changed on another sessions; this option is good for full-screen programs
which sup‐ port SIGWINCH and poor for interactive programs such as shells.
简单翻译一下:当打开这个选项之后,如果两个session显示的当前窗口不是同一个,那么两个session各自根据自己的大小来调整其当前窗口的尺寸(简单理解就是,各自最大化);如果两个session显示同一个窗口,那么还按之前的规则来(缩小到两边的公共面积内).
参考
- Screen-like tmux: Attach a tmux session from multiple clients and view different windows per client - fail2fail
- tmux - Attach to different windows in session - Unix & Linux Stack Exchange
- TMUX - Single window group, multiple session.md · GitHub (被蔷,我保存的副本见这里)
在tmux会话之间共享窗口(Windows & Panes)的更多相关文章
-
Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...
-
Tmux会话-基本操作及原理
一.Tmux命令介绍: Tmux (“Terminal Multiplexer”的简称), 是一款优秀的终端复用软件,类似 GNU screen,但比screen更出色. tmux来自于OpenBSD ...
-
Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码
本主题帮助你理解来自Prism的多目标和它的优缺点.多目标的代码针对两个不同的平台有大致相同的代码库.这允许同时保持代码尽可能多一样能够产生针对两种不同技术的二进制文件.在这种情况下,本节介绍 ...
-
DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)
DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...
-
Python 进程之间共享数据
最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享 在mp库当中,跨进程对象共享有三种方式,第一种 ...
-
wpf多程序集之间共享资源字典--CLR名称空间未定义云云
wpf多程序集之间共享资源字典--CLR名称空间未定义云云 分类: WPF 2012-10-28 10:57 1162人阅读 评论(0) 收藏 举报 以下介绍如何创建可用于在多个程序集之间共享的资源字 ...
-
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
-
学习笔记4_ServletContext(重要整个Web应用的动态资源之间共享数据)
ServletContext(重要) 一个项目只有一个ServletContext对象! 我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据! 与天地同寿!! ...
-
Android应用程序之间共享文字和图片(一)
以下为TestReceiveShare1工程 MainActivity如下: package cn.testreceiveshare1; import java.util.ArrayList; imp ...
随机推荐
-
lr文件下载脚本(文件参数化重命名)
http://wenku.baidu.com/link?url=6oiIadyF9eFS4VshKbfJDnxrBh2IX919ndi0JO8yoqTRNRNIpavFrZJ9LPVb-FBSfbRY ...
-
SPRING多个占位符配置文件解析源码研究--转
原文地址:http://www.cnphp6.com/archives/85639 Spring配置文件: <context:property-placeholder location=&quo ...
-
C++视频课程小结(2)
C++远征之离港篇 章节介绍: 每章小结: 第一章:大致讲了一下本章会讲的内容:引用vs指针.const vs #define(这个我在C里都没用过).函数变得更强大.内存管理要小心之类的. 第二章: ...
- Android Activity 管理
-
ASP.NET MVC 定义JsonpResult实现跨域请求
1:原理 在js中,XMLHttpRequest是不能请求不同域的数据,但是script标签却可以,所以可以用script标签实现跨域请求.具体是定义一个函数,例如jsonp1234,请求不同域的ur ...
-
SqlServer2008 数据库同步的两种方式 (发布、订阅)
尊重原著作:本文转载自http://www.cnblogs.com/tyb1222/archive/2011/05/31/2064944.html 上篇中说了通过SQL JOB的方式对数据库的同步,这 ...
- 为什么开启子进程 一定要放在 if __name__ == &#39;__main__&#39; 下面
-
java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri
在使用红米手机拍摄照片时,出现闪退的情况. 调用系统相机拍摄照片,使用FileProvider.getUriForFile传入Uri时,报异常 java.lang.SecurityException: ...
-
linux写文件,追加内容
覆盖文件 echo "hello" > filename 追加文件 echo "haha" >> filename
-
django的url的name参数的意义
Templates的链接地址都是根据urlpatterns定义的地址,拼凑成地址字符串,很难看,而且Templates里拼凑成的地址,随着页面的增加而不断增加,一旦在urlpatterns里的某个地址 ...