Tmux 没有在终端下运行?

Tmux 没有在终端下运行?

我开始使用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断开与会话的连接。该命令将继续在由tmuxunlike管理的 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,或者您自定义构建的东西。但它们的基本用途不同。

也可以看看

相关内容