如何用另一个程序替换图形终端中运行的程序?

如何用另一个程序替换图形终端中运行的程序?

假设我有top一个或某个 ncurses 程序在图形终端中运行,并且我想从该终端外部执行一个命令,该命令将替换top为我选择的另一个程序。

我想有一个通用的方法可以解决这个问题

  • 找到正确窗口的 PTY
  • 终止终端中的程序,同时保留 PTY
  • 生成替换命令,并且
  • 连接 PTY I/O 以从命令读取/写入

我在谷歌上搜索现有的通用解决方案来包装此问题,但没有产生有用的指针。

我对此的具体用例:我想将 gnome-terminal 中运行的 tmux 客户端从一个 /tmp/tmux-$UID/Socket (=server) 切换到属于同一用户的另一个客户端,而不会“丢失”窗户。

我正在寻找通用解决方案,因为我无法让已连接的 tmux 客户端在运行时连接/附加到新套接字。

答案1

据我所知,没有通用的解决方案可以做到这一点。 tmux 客户端运行在属于 gnome-terminal 的 pty 中,如果没有 gnome-terminal 的参与,您无法更改 gnome-terminal 正在与之通信的 pty 或更改 pty 所属的程序(主端或从属端)或没有一些非常繁琐的代码(例如,请参阅reptyr,它会执行与您想要的相反的操作 - 将程序移动到不同的 pty 而不是将 pty 移动到不同的程序)。

特别是对于 tmux,如果您的 tmux 足够新(2.4 或更高版本),您可以使用detach-client -E不同的进程替换正在运行的 tmux 客户端 - 这可能是另一个 tmux 客户端,例如:

tmux -Lfirstsocket detach -E 'tmux -Lsecondsocket attach'

如果您的 tmux 不够新,您的选择可能仅限于:

  • 使用新的 tmux 客户端在 gnome-terminal 中打开一个新选项卡并关闭原始选项卡;

  • 完全关闭你的 gnome 终端,然后用你想要的程序打开另一个终端;

  • 在旧 tmux 中打开新 tmux,然后隐藏状态行并取消旧 tmux 中的前缀设置,因此它仍在运行,但不会妨碍。

答案2

终端模拟器的问题是,当它们生成的可执行文件退出时,它们将关闭。但是您可以在终端模拟器内运行一个小包装器,它将:

  1. 从 UNIX 套接字接收命令,
  2. 执行它,
  3. 当新消息到达时终止该命令。
  4. 转到1。

像这样的东西小要点。您将文件保存在目录中,可以使用以下命令编译服务器:

gcc -Wall -o server libwrapper.c server.c

和客户:

gcc -Wall -o client libwrapper.c client.c

您在一个终端中运行服务器:

./server

并在另一个客户端中通过客户端切换命令:

./client /bin/cat /etc/motd

相关内容