Sí, un programa que se ejecuta sobre SSH dependerá de que su salida vaya a algún lado. Si la conexión es lenta, la salida debe estar almacenada en algún lugar y los almacenamientos intermedios no pueden ser infinitos, por lo que el programa debe bloquearse si están llenos.
Tenga en cuenta que la salida no necesariamente va a un terminal: considere ejecutar algo como
ssh user@somewhere "cat file.txt" > file.txt
En efecto, esto copiará el archivo. Para que esto funcione, la tasa de salida de cat debe coincidir con la de la conexión: debería ser obvio que perder partes de la salida del medio sería inaceptable.
La pantalla cambiará la situación, ya que actúa como un terminal y guardará lo que debe mostrarse "en la ventana del terminal" (más desplazamiento hacia atrás). No necesita recordar todo lo que genera su programa, solo las partes que se ajustarán a la "ventana" y al desplazamiento hacia atrás. Por defecto, la pantalla esperará una conexión lenta (bloqueando el programa), pero se puede configurar para detectar una conexión atascada al configurar "no bloqueado".
Desde la página del manual:
sin bloqueo [on | off | numsecs]
Indique a la pantalla cómo manejar las interfaces de usuario (pantallas) que dejan de aceptar la salida. Esto puede suceder si un usuario presiona ^ S o se corta una conexión TCP / módem pero no se recibe ningún bloqueo. Si la función no bloqueo está desactivada (este es el valor predeterminado), la pantalla espera hasta que la pantalla se reinicie para aceptar la salida. Si el bloqueo no está activado, la pantalla espera hasta que se alcanza el tiempo de espera (activado se trata como 1s). Si la pantalla aún no recibe caracteres, la pantalla la considerará "bloqueada" y dejará de enviarle caracteres. Si en algún momento se reinicia para aceptar caracteres, la pantalla desbloqueará la pantalla y volverá a mostrar el contenido actualizado de la ventana.
Una desconexión es diferente a una conexión lenta. Plain SSH no se puede recuperar automáticamente, por lo que su programa recibirá un SIGHUP. Por otro lado, la pantalla detectará una desconexión, se desconectará y volverá a la memoria intermedia local hasta que se vuelva a conectar la pantalla. Esto no bloqueará el programa en ejecución.
(La configuración nonblock 1
en su .screenrc
es importante si ejecuta algo como irssi que producirá continuamente salida pero que aún debe hablar con la red al mismo tiempo. El bloqueo conduciría a desconectarse del IRC, lo cual es extremadamente molesto ...)