Tak, program działający na SSH będzie zależał od tego, gdzie jego wyjście pójdzie. Jeśli połączenie jest wolne, dane wyjściowe muszą być gdzieś buforowane, a bufory nie mogą być nieskończone, więc program musi blokować, jeśli są wypełnione.
Zauważ, że wyjście niekoniecznie musi przejść do terminala: rozważ uruchomienie czegoś takiego
ssh user@somewhere "cat file.txt" > file.txt
Spowoduje to skopiowanie pliku. Aby to zadziałało, szybkość wyjściowa cat musi zgadzać się z szybkością połączenia: powinno być oczywiste, że utrata części wyjścia ze środka byłaby nie do przyjęcia.
Ekran zmieni sytuację, ponieważ będzie działał jak terminal i zapisze to, co powinno być pokazane „w oknie terminala” (plus przewijanie). Nie musi pamiętać wszystkich danych wyjściowych programu, tylko części pasujące do „okna” i przewijania. Domyślnie ekran będzie czekał na wolne połączenie (blokowanie programu), ale można go skonfigurować tak, aby wykrywał zablokowane połączenie, ustawiając „nonblock on”.
Ze strony podręcznika:
nonblock [on | off | numsecs]
Powiedz ekranowi, jak postępować z interfejsami użytkownika (ekranami), które przestają akceptować dane wyjściowe. Może się to zdarzyć, jeśli użytkownik naciśnie ^ S lub połączenie TCP / modem zostanie przerwane, ale nie zostanie zawieszone. Jeśli funkcja nonblock jest wyłączona (jest to ustawienie domyślne), ekran czeka na ponowne uruchomienie wyświetlacza, aby zaakceptować wyjście. Jeśli funkcja nonblock jest włączona, ekran czeka na przekroczenie limitu czasu (on jest traktowany jako 1s). Jeśli wyświetlacz nadal nie odbiera znaków, ekran uzna, że jest „zablokowany” i przestanie wysyłać do niego znaki. Jeśli w pewnym momencie ponownie zacznie akceptować znaki, ekran odblokuje wyświetlacz i ponownie wyświetli zaktualizowaną zawartość okna.
Rozłączenie różni się od wolnego połączenia. Zwykły SSH nie może odzyskać go automatycznie, więc twój program otrzyma POWIĘKSZENIE. Z drugiej strony ekran wykryje rozłączenie, odłączy się i wróci do lokalnego buforowania, dopóki ekran nie zostanie ponownie podłączony. Będzie to nie blokuje program.
(Ustawienie nonblock 1
w twoim .screenrc
jest ważne, jeśli uruchamiasz coś takiego jak irssi, które będzie stale wytwarzało dane wyjściowe, ale nadal musi rozmawiać z siecią w tym samym czasie. Blokowanie prowadziłoby do odłączenia się od IRC, co jest bardzo denerwujące ...)