我开始使用tmux
并发现一个有趣的东西,
在里面gnome-terminal
$ pstree -asp $$
systemd,1 splash
└─systemd,14385 --user
└─gnome-terminal-,15157
└─bash,17525
└─pstree,17551 -asp 17525
显然,当前pstree -asp $$
运行gnome-terminal
然而,当启动 tmux
$ pstree -asp $$
systemd,1 splash
└─systemd,14385 --user
└─tmux: server,16469
└─bash,17699
└─pstree,17794 -asp 17699
为什么 tmux 不在 之下gnome-terminal
?
答案1
最大的区别在于它gnome-terminal
是一个 GUI 应用程序,一个窗口。它是 Shell 的一种接口,但它们本质上是分开的。当 GUI 应用程序退出时,GUI 服务器(X11 以及可能还有 Wayland)将清理窗口并关闭它们。gnome-terminal
作为 Shell 的父级,将发送 SIGHUP 来关闭子进程,这将关闭 Shell 会话。TTY 控制台或 ssh 也会发生类似的情况。在 TTY 中,您有一个agetty
进程,它将接受您的登录凭据,然后启动特定程序(通常是 Shell),但在某些情况下,它可以配置为运行完全不同的程序。
现在,tmux
不同了 - 它是一个控制台应用程序,不依赖于登录(尽管你可以让它在登录 tty 时显示)。假设您在纽约有一台服务器,但您身在加利福尼亚。您想要启动一个长时间运行的命令,例如升级,然后断开与远程会话的连接。您可以做的是启动tmux
,在打开的 shell 中启动命令tmux
,然后通过Ctrl+ b&d断开与会话的连接。该命令将继续在由tmux
unlike管理的 shell 实例中运行gnome-terminal
。第二天您可以执行
$ tmux ls
0: 1 windows (created Fri May 17 13:42:54 2019) [167x48]
找到正在运行的会话并通过以下方式重新连接
$ tmux attach
或通过
$ tmux attach -t 0
附加到名为 0 的会话(如我的示例所示)。总体而言,它tmux
采用服务器-客户端方法,您连接到由服务器进程处理的特定会话,并且只要系统尚未重新启动,该通信就会通过 unix 域套接字(默认情况下为 )进行/tmp/tmux-<UID>
。
本质上,和都tmux
使用gnome-terminal
虚拟pts
终端设备(不同于tty
用于串行控制台或虚拟 tty1 控制台的)。它们都能够从/bin
或启动交互式 shell 和单个命令/usr/bin
,或者您自定义构建的东西。但它们的基本用途不同。
也可以看看