Problem
Ich führe einen Befehl aus, der VIELE Informationen über SSH ausgibt. Zum Beispiel füge ich törichterweise Debug-Informationen in eine Schleife ein, die millionenfach ausgeführt wird, oder laufe einfach nur cat /dev/urandom
um die Wette.
Das Terminal ist mit Informationen überflutet.
Ich möchte den Befehl so schnell wie möglich beenden und mein Programm reparieren. Es ist mir egal, was es druckt. Jetzt drücke ich Ctrl+ CSO BALD WIE MÖGLICH (im obigen Beispiel habe ich es sofort nach Ausführung des Befehls gedrückt), aber es dauert noch einige Zeit, bis alle Informationen gedruckt sind, die ich nicht einmal benötige .
Was ich versucht habe
Ich habe versucht, Ctrl+ Cso fest zu drücken , dass es komische Ergebnisse brachte, als das Terminal endlich aufholte:
OUTPUT HERE^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
^C^C
^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
Ich habe auch über Ctrl+ gelesen, Sdas anscheinend verwendet wird, um dem Terminal mitzuteilen, dass "Ausgabe stoppen, ich muss aufholen", aber anscheinend tut es nichts.
Verschiedene Details
Ich möchte den Befehl, den ich ausführe, nicht ändern, damit ich mich in jeder Situation retten kann, auch wenn ich mich nicht erinnere, dass das von mir ausgeführte Programm so enden könnte.
Mein SSH-Client wird unter Cygwin ( CYGWIN_NT-6.1-WOW64 luna 1.7.30(0.272/5/3) 2014-05-23 10:36 i686 Cygwin
) in MinTTY mit dem Terminaltyp "" ausgeführt xterm-256color
.
SSH-Server läuft unter Debian ( Linux burza 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 i686 i686 GNU/Linux
).
Ctrl-O
, was bedeutet, dass alle auf dieses Terminal geschriebenen Ausgaben verworfen werden.-j
Option zu starten , um das Jump-Scrolling zu aktivieren. Das Grundproblem besteht darin, dass die Fernbedienung Daten schneller senden kann, als das Terminalfenster dies anzeigen kann. Standardmäßig muss der Inhalt des Fensters bei jedem Ausdruck einer neuen Zeile bitweise angezeigt werden. Eine ganze Menge von Daten kann gepuffert werden, bis Ihr Ctrl-C vom Remote-System empfangen wird, und Ihr Terminal-Programm wird versuchen, alles anzuzeigen..bashrc
?Antworten:
Ein Teil dieser Ausgabe wird gepuffert. Sie senden Ihr Ctrl+ Can das entfernte Ende, wodurch das laufende Programm unterbrochen wird. Das Programm ist vorhanden und die Shell sendet die Zeichen, um Ihnen die Eingabeaufforderung erneut anzuzeigen. Bevor die Eingabeaufforderung angezeigt wird, zeigt Ihr Bildschirm zunächst alle Daten an, die gepuffert wurden und bereits auf dem Weg zu Ihnen sind.
Was Sie verlangen, ist, dass das Programm stoppt und die Daten, die gerade übertragen werden, irgendwie verschwinden. Das kann nicht passieren, da es bereits unterwegs ist.
Die einzige Möglichkeit, sicherzustellen, dass diese Daten nicht angezeigt werden, besteht darin, das Terminal an Ihrem Ende zu verlassen und die Verbindung zu Ihrer Fernbedienung wiederherzustellen. Dies ist jedoch wahrscheinlich weitaus aufwändiger, als auf die Anzeige der gepufferten Daten zu warten.
quelle
Normalerweise starte ich die Ausgabe,
less
damit ich sie mit töten kann,less
anstatt den qSchlüssel zu benutzen .Beispiel
Nachdem Sie auf q+ geklickt haben, wird Enteres beendet und kehrt zu Ihrem normalen Terminal zurück, sodass es schön sauber bleibt.
Warum passiert das?
Das Problem, auf das Sie stoßen, besteht darin, dass Puffer (für STDOUT) mit der Ausgabe Ihrer Anzeige in die Warteschlange gestellt werden. Diese Puffer füllen sich so schnell, dass Sie sie nicht schnell genug unterbrechen können, um sie zu stoppen.
Um diesen Effekt zu deaktivieren / einzuschränken, können Sie die STDOUT-Pufferung deaktivieren, wodurch die Verwendung etwas reaktionsschneller wird.
stdbuf
Sie müssen jedoch wahrscheinlich mit diesen Einstellungen spielen, um die gewünschten Ergebnisse zu erzielen . Um STDOUT zu entpuffern, können Sie diesen Befehl verwenden:Auf der Manpage finden Sie
stdbuf
Details zu den verfügbaren Optionen:Um einen guten Überblick über die Funktionsweise des Puffers zu erhalten, empfehle ich einen Blick auf diesen Pixel Beat mit dem Titel: Puffern in Standard-Streams . Es enthält sogar schöne Bilder.
Verweise
quelle
|less
ancmd
, was leider oft ich nicht. Wenn Sie ausgeführt werdencmd
, müssen Sie noch warten, bis der Druck der berechneten Ergebnisse abgeschlossen ist, bevor Sie sie empfangen^C
.Es gibt mehrere Pufferebenen. Durch Drücken von Ctrl+ wird verhindert C, dass das Programm Daten an das Terminal sendet. Dies wirkt sich nicht auf Daten aus, die der Terminalemulator noch nicht angezeigt hat.
Wenn Sie Daten mit sehr hoher Geschwindigkeit anzeigen, kann das Terminal nicht mithalten und wird verzögert. Genau das ist hier der Fall: Das Anzeigen von Text ist viel teurer als das Erzeugen dieser Zufallszahlen. Ja, auch mit einer Bitmap-Schriftart - die Erzeugung von Zufallszahlen in kryptografischer Qualität ist im Vergleich spottbillig. (Ich habe es gerade auf meinem Rechner versucht und der X-Prozess hat die CPU mit
xterm
ein paar Prozent ausgelastet, undcat
(was der Zufallszahlengenerierung zugerechnet wird) erreicht kaum 1 Prozent. Und das mit einer Bitmap-Schriftart.)Wenn Sie möchten, dass dies jetzt beendet wird, beenden Sie den Terminalemulator. Wenn Sie das nicht möchten, minimieren Sie zumindest das Fenster. Intelligente Terminal-Emulatoren (z. B. xterm) ordnen das Fenster nicht zu, wodurch die X-CPU-Zeit gespart wird, sodass der Müll schneller angezeigt wird. Der X-Server hat eine hohe Priorität, sodass sich dies erheblich auf die Reaktionsfähigkeit Ihres Computers auswirkt, während xterm die Daten im Hintergrund verarbeitet.
Wenn dies alles in einer Remote-Shell geschieht, ist die Verzögerung noch schlimmer, da die von erzeugten Daten
cat
zuerst die SSH-Verbindung durchlaufen müssen. Ihre Presse von Ctrl+ muss Cauch über die SSH-Verbindung gehen; Die Priorität ist etwas höher (es wird außerhalb des Bandes gesendet), aber das dauert noch einige Zeit, während der sich mehr Output ansammelt. Es gibt keine Möglichkeit, Daten während der Übertragung zu unterdrücken, ohne die SSH-Verbindung zu beenden (was Sie tun können, indem Sie Enterdann auf drücken~.
).quelle
Es sollte ausreichen , um einen Weg zu finden ,
kill
dencat
Befehl.Für die folgenden Vorschläge benötigen Sie möglicherweise eine zweite offene SSH-Verbindung.
Selten CTRL+zkann es effektiver sein als CTRL+c: es kann schneller antworten. Danach setzen Sie den Befehl aus, mit dem Sie ihn beenden können,
kill %1
oder wie auch immer seine Auftragsnummer lautet.Dies in der Hoffnung, dass Sie immer noch in der Lage sind, alles auf dem Bildschirm zu lesen (ein überflutender zufälliger Binärtext kann Ihren Zeichensatz leicht durcheinander bringen). Wenn Sie das Fenster minimieren, ist das System wahrscheinlich schneller beim Lesen der Interrupt-Anforderung als beim Beenden des Prozesses,
wie Gilles sich erinnert hat . Also aussetzen / unterbrechen, minimieren, etwas warten, wieder maximieren, kann auch eine Lösung sein.
Natürlich erwarte ich über eine ssh-Verbindung, dass du allerdings etwas warten musst.
In einem anderen Terminal / einer anderen Sitzung können Sie fragen
pgrep cat
(ob cat der aufgerufene Befehl war), und feststellen, dass der cat-Prozess mehr Ihre CPU verwendet. Sie können es genauer identifizieren mitpstree
:pgrep katze | awk '{print "pstree -sp" $ 1}' | sh | grep sshd
antworte mit einer Ausgabe wie
init (1) ───sshd (1062) ───sshd (22884) ───sshd (22951) ───bash (22957) ───cat (23131)
In diesem Fall müssen Sie nur die PID der Katze töten: 23131 töten
Hinweis:
less
ist sicherer.quelle
Ich hatte das gleiche Problem und war mit den Antworten hier nicht zufrieden, also habe ich tiefer gegraben. Andere haben bereits erwähnt, dass Ihr Befehl Daten schneller ausgibt, als Ihr ssh verarbeiten kann, sodass die Datenpuffer und -puffer nicht angehalten werden können.
Um dies zu beheben, vermeiden Sie das Puffern, indem Sie die Befehlsausgabe auf die maximale Geschwindigkeit drosseln, die Ihre SSH-Sitzung annehmen kann. Hierzu sind bereits Befehle vorhanden.
Ermitteln Sie zuerst Ihre maximale Sitzungsrate:
Zum Schluss drosseln Sie Ihre echten Befehle entsprechend.
Beispiel:
Möglicherweise möchten Sie die RATE ein wenig reduzieren, falls Ihre Verbindungsgeschwindigkeit von Zeit zu Zeit ein wenig sinkt. Wenn es abfällt, kehrt das Verhalten zum Problem zurück, einem nicht reagierenden Strg-C.
Optionaler gedrosselter Katzenalias:
Jetzt funktioniert Strg-C wie erwartet und beendet die Ausgabe sofort, da nur sehr wenig oder gar nichts gepuffert ist.
quelle
cat
Die Ausgabe ist im Gegensatz zu anderer Software selten ein Problem. Der Autor hat es nur als Beispiel verwendet. Das Problem liegt normalerweise an der anderen Software, die möglicherweise nicht offensichtlich ist, wenn sie bereit ist, viel Ausgabe zu produzieren. Die Verwendung eines Präfix- oder Postfix-Befehls ist keine Lösung, da die Eingabe einige Zeit in Anspruch nimmt. Es wird keinen Gewinn im Ergebnis geben.Unter Linux gibt es eine Software, die genau dieses Problem löst (ein paar andere Dinge auch). Sie können es auch von einem Terminalemulator in Windows aus aufrufen (Sie scheinen Windows zu verwenden?).
Versuchen Sie mosh , einen Ersatz für die SSH-Binärdatei. Es funktioniert genau wie SSH (Sie können es
mosh user@hostname
stattdessen tunssh user@hostname
und es würde genau so funktionieren, wie Sie es erwarten, es wird sogar eine Authentifizierung mit privatem Schlüssel usw. durchgeführt.)Grundsätzlich wird ein separater Prozess auf dem Server ausgeführt, der die Pakete puffert. Wenn Sie also bei mosh Strg + C drücken, wird dies an den Remote-Server weitergeleitet, der dann die zusätzlichen Informationen nicht mehr sendet. Außerdem wird das Ergebnis von Tastenanschlägen vorhergesagt, sodass Sie bei jedem Tastendruck einige Millisekunden Zeit sparen.
Nachteil: Derzeit ist es nicht möglich, mit mosh im Verlauf nach oben zu scrollen.
quelle