Sì, un programma in esecuzione su SSH dipenderà dalla sua uscita andando da qualche parte. Se la connessione è lenta, l'output deve essere bufferizzato da qualche parte e i buffer non possono essere infiniti, quindi il programma deve bloccare se sono riempiti.
Nota che l'output potrebbe non andare necessariamente a un terminale: considera di eseguire qualcosa di simile
ssh user@somewhere "cat file.txt" > file.txt
Questo in effetti copierà il file. Perché ciò funzioni, la velocità di output di cat deve corrispondere a quella della connessione: dovrebbe essere ovvio che perdere parti dell'output dal centro sarebbe inaccettabile.
Lo schermo cambierà la situazione in quanto si comporta come un terminale e salverà ciò che dovrebbe essere mostrato "nella finestra del terminale" (più scrollback). Non ha bisogno di ricordare tutto ciò che il programma emette, solo le parti che si adattano alla "finestra" e allo scrollback. Per impostazione predefinita, lo schermo attenderà una connessione lenta (bloccando il programma), ma può essere configurato per rilevare una connessione bloccata impostando "non-block on".
Dalla pagina man:
nonblock [on | off | numsecs]
Spiega allo schermo come gestire le interfacce utente (display) che cessano di accettare l'output. Ciò può accadere se un utente preme ^ S o viene interrotta una connessione TCP / modem ma non viene ricevuto alcun blocco. Se il blocco non è disattivato (questa è l'impostazione predefinita) attende che il display si riavvii per accettare l'output. Se il blocco non è attivo, lo schermo attende fino al raggiungimento del timeout (acceso viene trattato come 1 secondo). Se il display continua a non ricevere caratteri, lo schermo lo considererà "bloccato" e interromperà l'invio di caratteri. Se a un certo punto si riavvia per accettare i caratteri, lo schermo sbloccherà il display e visualizzerà nuovamente il contenuto della finestra aggiornata.
Una disconnessione è diversa da una connessione lenta. Il semplice SSH non può ripristinarsi automaticamente da esso, quindi il tuo programma riceverà un SIGHUP. D'altra parte, lo schermo rileverà una disconnessione, si staccherà e tornerà al buffering locale fino a quando lo schermo non viene ricollegato. Ciò non bloccherà il programma in esecuzione.
(L'impostazione nonblock 1
in your .screenrc
è importante se si esegue qualcosa come irssi che produrrà continuamente output ma che dovrà comunque comunicare con la rete allo stesso tempo. Il blocco porterebbe a disconnettersi dall'IRC, il che è estremamente fastidioso ...)