Ja, ein Programm, das über SSH läuft, hängt davon ab, ob die Ausgabe irgendwo abläuft. Wenn die Verbindung langsam ist, muss die Ausgabe irgendwo gepuffert werden und die Puffer können nicht unendlich sein, daher muss das Programm blockieren, wenn sie gefüllt sind.
Beachten Sie, dass die Ausgabe möglicherweise nicht unbedingt an ein Terminal gesendet wird
ssh user@somewhere "cat file.txt" > file.txt
Dadurch wird die Datei tatsächlich kopiert. Damit dies funktioniert, muss die Ausgaberate von cat mit der der Verbindung übereinstimmen: Es sollte offensichtlich sein, dass ein Verlust von Teilen der Ausgabe aus der Mitte inakzeptabel wäre.
Der Bildschirm ändert die Situation dahingehend, dass er sich wie ein Terminal verhält und speichert, was "im Terminalfenster" angezeigt werden soll (plus Scrollback). Es muss sich nicht alles merken, was Ihr Programm ausgibt, sondern nur die Teile, die in das "Fenster" und den Bildlauf passen. Standardmäßig wartet der Bildschirm auf eine langsame Verbindung (Blockierung des Programms), aber er kann so konfiguriert werden, dass eine blockierte Verbindung erkannt wird, indem "nonblock on" eingestellt wird.
Von der Manpage:
nonblock [on | off | numsecs]
Sagen Sie dem Bildschirm, wie mit Benutzeroberflächen (Displays) umgegangen werden soll, die die Ausgabe nicht mehr akzeptieren. Dies kann passieren, wenn ein Benutzer ^ S drückt oder eine TCP / Modem-Verbindung getrennt wird, aber kein Auflegen empfangen wird. Wenn nonblock deaktiviert ist (dies ist die Standardeinstellung), wartet der Bildschirm, bis die Anzeige neu gestartet wird, um die Ausgabe zu akzeptieren. Wenn nonblock aktiviert ist, wartet der Bildschirm, bis das Timeout erreicht ist (on wird als 1s behandelt). Wenn das Display immer noch keine Zeichen empfängt, wird es vom Bildschirm als "blockiert" betrachtet und das Senden von Zeichen wird gestoppt. Wenn es zu einem bestimmten Zeitpunkt erneut gestartet wird, um Zeichen zu akzeptieren, wird die Anzeige auf dem Bildschirm freigegeben und der aktualisierte Fensterinhalt wird erneut angezeigt.
Eine Trennung unterscheidet sich von einer langsamen Verbindung. Normales SSH kann nicht automatisch wiederhergestellt werden, sodass Ihr Programm einen SIGHUP erhält. Auf der anderen Seite erkennt der Bildschirm eine Unterbrechung, löst sich und greift auf die lokale Pufferung zurück, bis der Bildschirm wieder angeschlossen wird. Das laufende Programm wird dadurch nicht blockiert.
(Das Einstellen nonblock 1
von "your" .screenrc
ist wichtig, wenn Sie so etwas wie "irssi" ausführen, das kontinuierlich Ausgabe erzeugt, aber dennoch gleichzeitig mit dem Netzwerk kommunizieren muss. Das Blockieren würde dazu führen, dass die Verbindung zum IRC getrennt wird, was äußerst ärgerlich ist ...)