Да, программа, работающая через SSH, будет зависеть от того, куда она направляется. Если соединение медленное, вывод должен быть где-то буферизован, а буферы не могут быть бесконечными, поэтому программа должна блокироваться, если они заполнены.
Обратите внимание, что вывод может не обязательно идти в терминал: подумайте о запуске чего-то вроде
ssh user@somewhere "cat file.txt" > file.txt
Это фактически скопирует файл. Чтобы это работало, скорость вывода cat должна соответствовать скорости соединения: должно быть очевидно, что потеря частей вывода из середины была бы неприемлемой.
Экран изменит ситуацию в том смысле, что он действует как терминал и сохранит то, что должно отображаться «в окне терминала» (плюс прокрутку). Не нужно запоминать все, что выводит ваша программа, только те части, которые будут соответствовать «окну» и прокрутке. По умолчанию экран будет ожидать медленного соединения (блокирования программы), но его можно настроить на обнаружение зависшего соединения, установив «неблокирование включено».
Со страницы руководства:
неблокировать [on | off | numsecs]
Скажите экрану, как обращаться с пользовательскими интерфейсами (дисплеями), которые перестают принимать вывод. Это может произойти, если пользователь нажимает ^ S или соединение TCP / модема обрывается, но не происходит зависание. Если неблокирование выключено (это значение по умолчанию), экран ожидает перезагрузки дисплея, чтобы принять вывод. Если неблокирование включено, экран ожидает, пока не истечет тайм-аут (вкл. Рассматривается как 1 с). Если дисплей по-прежнему не принимает символы, экран сочтет его «заблокированным» и прекратит отправку символов на него. Если через некоторое время он перезапустит прием символов, экран разблокирует дисплей и снова отобразит обновленное содержимое окна.
Разъединение отличается от медленного соединения. Обычный SSH не может восстановиться автоматически, поэтому ваша программа получит SIGHUP. С другой стороны, экран обнаружит отключение, отсоединение и возврат к локальной буферизации, пока экран не будет снова подключен. Это не заблокирует работающую программу.
(Настройка nonblock 1
в вашем .screenrc
важна, если вы запускаете что-то вроде irssi, которое будет непрерывно производить вывод, но все равно должно одновременно общаться с сетью. Блокировка может привести к отключению от IRC, что крайне раздражает ...)