Gibt es eine Möglichkeit, das Einfrieren von tmux zu verhindern, wenn viel Text auf dem Terminal ausgegeben wird?

38

In einer tmux-Sitzung innerhalb von xterm, wenn ein Programm eine Menge Output erzeugt (wie cat very_long_filedie gesamte Sitzung für eine Weile eingefroren ist. Auch wenn ich Strg-C drücke, wird nichts unterbrochen. Vermutlich, weil tmux eingefroren ist und Strg-C nicht an weiterleitet Gibt es eine Möglichkeit, dies zu verhindern?

ecerulm
quelle
Das Problem ist, dass das Programm seine Ausgabe auf Standardausgabe viel schneller geschrieben hat, als Ihr Terminal sie anzeigen konnte. Wenn Sie Strg + C drücken, wird der Vorgang zwar abgebrochen, aber Ihr Terminal druckt die gepufferte Ausgabe weiter.
Chepner
1
Die horizontale Aufteilung von tmux-Fenstern (dh Cb%) ist für dieses Problem viel empfindlicher als vollständige Fenster oder vertikal aufgeteilte Fenster. Wenn Sie Cb d ausführen und erneut anfügen, wird das Programm "eingefroren", allerdings nur vorübergehend. Es gibt keine wirkliche Lösung, wenn Sie nicht bereit sind, sich mit tmux-Konfigurationen zu befassen.
RussellStewart

Antworten:

15

Die richtige Lösung besteht darin, die c0- * -Optionen von tmux zu prüfen, um zu versuchen, die Ausgabe mit einer Geschwindigkeitsbegrenzung zu versehen. Der Grund, warum dieses Problem überhaupt besteht, liegt darin, dass Daten schneller an das Terminal gesendet werden, als es anzeigen kann. Daher ist die Geschwindigkeitsbegrenzung die einzige Möglichkeit.

ThomasAdam
quelle
c0-change-trigger und c0-change-interval scheinen das Problem zu lösen. Die Standardeinstellungen reichen mir aus.
Ecerulm
setw -g c0-change-interval 100und setw -g c0-change-trigger 250macht für mich keinen Unterschied. Ich benutze tmux-1.8. Habe ich etwas falsch gemacht?
Solotim
@solotim Arbeiten auf meinem tmux 1.9a, jedoch habe ich set-window-option -g ...in meiner .tmux.conf.
Polym
5
Anscheinend wurden diese in tmux 2.2 entfernt. :(
Martin C. Martin
20

Ich habe immer noch dieses Problem in tmux 1.6-2 auf Ubuntu 12.10. Eine Problemumgehung, die ich gefunden habe, besteht darin, die Sitzung zu beenden (Präfix + d) und dann erneut zuzuordnen (ein tmux attachguter Kandidat für einen schnellen Shell-Alias). Es sieht so aus, als ob tmux unter der Haube tatsächlich reagiert. Sie können mit Strg-C bestätigen, dass Ihr Prozess tatsächlich sofort beendet wird. Es ist nur die Zeichnung, die blockiert. Detatch funktioniert sofort, und wenn Sie es erneut anfügen, wird die Zeichnung bis zum Ende übersprungen.

Jack O'Connor
quelle
Gute Problemumgehung. Es scheint, dass in der Tat alles funktioniert, auch das Umschalten zwischen Teilungen, es wird einfach nicht gezeichnet.
Jmiserez
1
Das sollte sein tmux attach, oder?
Pandubear
Hoppla, du hast recht. Fest.
Jack O'Connor
2
Und wenn Sie das Makro nicht entfernen können, z. B. nicht sicher, öffnen Sie einfach ein neues Terminalfenster und tmux attach.
Mahemoff
5

Soweit ich weiß, gibt es keine Möglichkeit, dies in aktuellen Releases zu verhindern, es wird jedoch noch daran gearbeitet. Sie finden einige Patches auf der Mailingliste von tmux unter http://thread.gmane.org/gmane.comp.terminal-emulators.tmux.user/2689 .

Ein gutes Schlüsselwort für die Suche im Web ist "Flusskontrolle".

piec
quelle
2
Warum wird der Patch im Hauptzweig nicht validiert? Dieses Problem ist der wichtigste Grund, warum ich immer noch gnu_screen benutze.
Solotim
5

Leider wurden die c0- * -Optionen für die Ratenbegrenzung ab tmux Version 2.1 ( Changelog ) entfernt. Soweit ich weiß, besteht die einzige Möglichkeit, die Ratenbegrenzung anzupassen, darin, die sie beeinflussenden Variablen im Quellcode (tmux.h) zu aktualisieren:

" READ_SIZE ist die maximale Datengröße, die von einem Pty gespeichert werden soll (das Ereignis mit hohem Wasserzeichen). READ_BACKOFF ist die Datenmenge, die auf die Ausgabe auf ein Tty wartet, bevor Pty-Lesevorgänge zurückgesetzt werden. READ_TIME ist die Zeitspanne, die bis zum nächster Lesevorgang (in Mikrosekunden), wenn ein tty über READ_BACKOFF liegt. "

Wo finden Sie die Standardeinstellungen: (ab tmux v2.2):

#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100
Evangelien
quelle
1
In tmux v2.3 existieren die angegebenen Variablen nicht.
Bergercookie
4

Die Antwort https://superuser.com/a/589896/311481 funktioniert einwandfrei. Ich verwende folgende Werte:

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

Ein weiterer Tipp: Wenn Sie in tmux ssh verwenden, verwenden Sie stattdessen mosh: http://mosh.mit.edu/ . Bei Bedarf wird versucht, den letzten Bildschirmstatus anzuzeigen, in dem Zwischenprodukte gelöscht werden. Tmux friert also nie ein, wenn in seinen Fenstern viele Ausgaben mit Mosh-Sessions generiert werden.

Im Gegensatz zu SSH behandelt das UDP-basierte Protokoll von mosh den Paketverlust ordnungsgemäß und legt die Bildrate basierend auf den Netzwerkbedingungen fest. Mosh füllt keine Netzwerkpuffer, daher arbeitet Control-C immer, um einen außer Kontrolle geratenen Prozess anzuhalten.

Da SSP (State Synchronization Protocol, das mosh verwendet) auf der Objektebene arbeitet und die Synchronisationsrate (dh die Bildrate) steuern kann, muss nicht jedes Byte gesendet werden, das von der Anwendung empfangen wird. Das bedeutet, dass Mosh die Frames regulieren kann, um die Netzwerkpuffer nicht zu füllen, die Reaktionsfähigkeit der Verbindung zu erhalten und sicherzustellen, dass Control-C immer schnell funktioniert. Protokolle, die jedes Byte senden müssen, können dies nicht.

user2683246
quelle
0

Probieren Sie einen anderen Terminal-Emulator aus. Unter RedHat 6.5 gibt es auf der Konsole (KDE) kein Problem mit dem Einfrieren (tmux 2.3 und master). Sowohl xterm als auch gnome-terminal können schlecht einfrieren.

kko
quelle
tmux 2.2 funktioniert jedoch problemlos auf allen drei Terminalemulatoren.
kko