グラフィック端末で実行されているプログラムを別のプログラムに置き換える方法は?

グラフィック端末で実行されているプログラムを別のプログラムに置き換える方法は?

グラフィックターミナルで実行されるncursesプログラムがあり、そのターミナルの外で私が選択した他のプログラムにtop置き換えられるコマンドを実行したいとしましょう。top

この問題を解決する一般的な方法があると思います。

  • 正しいウィンドウのPTYを探す
  • PTYを維持しながら端末でプログラムを終了
  • 代替コマンドを生成し、
  • PTY I/Oを接続してコマンドを読み書きする

この問題を解決するために、従来の一般的なソリューションをGoogleで検索しましたが、便利なポインタは生成されませんでした。

これに対する具体的なユースケース:gnome-terminalで実行されているtmuxクライアントを1つの/tmp/tmux-$UID/Socket(=サーバー)でウィンドウを「失うことなく」同じユーザーに属する別のクライアントに切り替えたいと思います。

実行時に接続されたtmuxクライアントを新しいソケットに接続/取り付けることができないため、一般的なソリューションを探しています。

ベストアンサー1

私が知る限り、これには普遍的な解決策はありません。 tmuxクライアントは、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 でプレフィックス設定をオフにすると、引き続き実行されますが邪魔になりません。

おすすめ記事