Oui, un programme exécuté sur SSH dépendra de sa sortie quelque part. Si la connexion est lente, la sortie doit être mise en mémoire tampon quelque part et les mémoires tampons ne peuvent pas être infinies, donc le programme doit bloquer s'il est rempli.
Notez que la sortie ne va pas nécessairement aller à un terminal: envisagez d'exécuter quelque chose comme
ssh user@somewhere "cat file.txt" > file.txt
Cela copiera en fait le fichier. Pour que cela fonctionne, le taux de sortie de cat doit correspondre à celui de la connexion: il devrait être évident que perdre des parties de la sortie du milieu serait inacceptable.
L'écran changera la situation en ce qu'il agira comme un terminal et enregistrera ce qui devrait être affiché "sur la fenêtre du terminal" (plus défilement arrière). Il n'a pas besoin de se souvenir de tout ce que votre programme sort, seulement des parties qui s'adapteront à la "fenêtre" et au défilement. Par défaut, l'écran attendra une connexion lente (bloquant le programme), mais il peut être configuré pour détecter une connexion bloquée en définissant "nonblock on".
Depuis la page de manuel:
nonblock [on | off | numsecs]
Dites à l'écran comment gérer les interfaces utilisateur (affichages) qui cessent d'accepter la sortie. Cela peut se produire si un utilisateur appuie sur ^ S ou si une connexion TCP / modem est coupée mais qu'aucun raccrochage n'est reçu. Si le nonbloc est désactivé (c'est la valeur par défaut), l'écran attend que l'affichage redémarre pour accepter la sortie. Si le nonbloc est activé, l'écran attend que le délai soit atteint (on est traité comme 1 s). Si l'écran ne reçoit toujours pas de caractères, l'écran le considérera comme "bloqué" et cessera de lui envoyer des caractères. Si à un moment donné il redémarre pour accepter les caractères, l'écran débloquera l'affichage et réaffichera le contenu de la fenêtre mise à jour.
Une déconnexion est différente d'une connexion lente. Plain SSH ne peut pas s'en remettre automatiquement, donc votre programme recevra un SIGHUP. D'autre part, l'écran détectera une déconnexion, se détachera et retombera dans la mise en mémoire tampon locale jusqu'à ce que l'écran soit reconnecté. Cela ne bloquera pas le programme en cours d'exécution.
(Le paramétrage nonblock 1
de votre .screenrc
est important si vous exécutez quelque chose comme irssi qui produira en continu une sortie mais doit toujours parler au réseau en même temps. Le blocage entraînerait la déconnexion d'IRC, ce qui est extrêmement ennuyeux ...)