グラフィックターミナルで実行される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 でプレフィックス設定をオフにすると、引き続き実行されますが邪魔になりません。
答え2
ターミナルエミュレータの問題は、作成した実行可能ファイルが終了すると閉じられることです。ただし、端末エミュレータ内で次の小さなラッパーを実行できます。
- UNIXソケットからコマンドを受け取ります。
- それを実行し、
- 新しいメッセージが届いたら、コマンドを終了します。
- 1に進みます。
このような小さな点。ファイルをディレクトリに保存し、次を使用してサーバーをコンパイルできます。
gcc -Wall -o server libwrapper.c server.c
顧客と:
gcc -Wall -o client libwrapper.c client.c
端末でサーバーを実行します。
./server
そして、クライアントスイッチコマンドを介して他のクライアントから:
./client /bin/cat /etc/motd