大量のテキストが端末に出力されるときにtmuxがフリーズするのを防ぐ方法はありますか?


38

xterm内のtmuxセッションで、プログラムが大量の出力を生成するとき(cat very_long_fileセッション全体がしばらくフリーズするなど。Ctrl-Cを押しても何も中断されません。おそらくtmuxがフリーズし、Ctrl-Cを転送しないため出力を生成するプログラム。これを防ぐ方法はありますか。


問題は、端末が表示できるよりもはるかに高速にプログラムが出力を標準出力に書き込んだことです。Ctrl-Cを押すと、プロセスは実際に強制終了されますが、端末はバッファリングされた出力を印刷し続けます。
chepner

1
tmuxペインの水平方向の分割(つまり、Cb%)は、完全なペインや垂直方向の分割ペインよりも、この問題の影響を受けやすくなっています。また、一時的ではありますが、Cb dを実行して再アタッチするとプログラムが「フリーズ解除」されます。tmux構成を掘り下げない限り、実際には解決策はありません。
ラッセルスチュワート14

回答:


15

正しい解決策は、tmuxのc0- *オプションを調べて、出力をレート制限することです。この問題が存在する理由は、端末に表示されるよりも速くデータが端末に送信されるためです。そのため、レート制限が唯一の方法です。


c0-change-triggerとc0-change-intervalは問題を解決するようです。デフォルトの設定で十分です。
ecerulm

setw -g c0-change-interval 100そして、setw -g c0-change-trigger 250私のための任意の違いはありません。tmux-1.8を使用しています。私は何か間違ったことをしましたか?
ソロティム

@solotimはtmux 1.9aで動作しますが、に追加set-window-option -g ...しました.tmux.conf
ポリム

5
どうやら、これらはtmux 2.2で削除されました。:(
マーティンC.マーティン

20

Ubuntu 12.10のtmux 1.6-2にはまだこの問題があります。私が見つけた回避策の1つは、セッションから外して(prefix + d)、再接続することです(tmux attachクイックシェルエイリアスの良い候補)。tmuxは実際にフードの下で反応するように見えます--- ctrl-cでプロセスが実際に強制終了されていることを確認できます-ブロックしているのは描画だけです。デタッチはすぐに機能し、再アタッチすると、図面は最後までスキップされます。


良い回避策。実際、すべてが機能しているようで、分割を切り替えても、描画されません。
jmiserez

1
これはtmux attach正しいはずですか?
pandubear

おっと、あなたは正しい。一定。
ジャックオコナー14年

2
また、マクロがわからないなど、切り離せない場合は、新しいターミナルウィンドウを開きますtmux attach
mahemoff 14

5

私の知る限り、現在のリリースではそれを防ぐ方法はありませんが、いくつかの作業が進行中です。tmuxのメーリングリストhttp://thread.gmane.org/gmane.comp.terminal-emulators.tmux.user/2689でいくつかのパッチを見つけることができます。

Webを検索するのに適したキーワードは「フロー制御」です。


2
なぜメインブランチでパッチが検証されないのですか?この問題は、私がまだgnu_screenを使用する最も重要な理由です。
ソロティム

5

残念ながら、tmuxバージョン2.1(changelog)から、レート制限のc0- *オプションは削除されました。私の知る限り、レート制限をカスタマイズする唯一の方法は、ソースコード(tmux.h)で影響する変数を更新することです。

" READ_SIZEは、ptyから保持するデータの最大サイズです(イベントの最高水位標)。 TTYがREAD_BACKOFFを超えている場合は、次の(マイクロ秒)をお読みください。 "

デフォルトの場所:(tmux v2.2以降):

#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100

1
tmux v2.3では、示された変数は存在しません。
bergercookie

4

答えhttps://superuser.com/a/589896/311481は正常に機能します。次の値を使用します。

setw -g c0-change-trigger 10
setw -g c0-change-interval 250

別のヒント:tmux内でsshを使用する場合は、代わりにmoshを使用してくださいhttp ://mosh.mit.edu/ プログラムの出力を表示する場合のほうがスマートに動作します。必要に応じて、中間体をドロップして最後の画面状態を表示しようとします。そのため、moshセッションを含むペイン内で大量の出力が生成された場合、tmuxはフリーズしません。

SSHとは異なり、moshのUDPベースのプロトコルはパケット損失を適切に処理し、ネットワークの状態に基づいてフレームレートを設定します。Moshはネットワークバッファーをいっぱいにしないため、Control-Cは常に暴走プロセスを停止するように動作します。

SSP [moshが使用する状態同期プロトコル]はオブジェクト層で動作し、同期の速度(言い換えれば、フレームレート)を制御できるため、アプリケーションから受信するすべてのバイトを送信する必要はありません。つまり、Moshは、ネットワークバッファーがいっぱいにならないようにフレームを調整し、接続の応答性を維持し、Control-Cが常に迅速に機能することを確認できます。すべてのバイトを送信しなければならないプロトコルはこれを行うことができません。


0

別の端末エミュレータを試してください。RedHat 6.5では、konsole(KDE)にフリーズの問題はありません(tmux 2.3およびmaster)。ただし、xtermとgnome-terminalはどちらもひどい凍結を経験します。


ただし、tmux 2.2は、3つすべてのターミナルエミュレータでフリーズすることなく正常に動作します。
kko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.