Un programme exécuté à partir d'une session ssh dépend-il de la connexion au client? Par exemple lorsque la connexion est vraiment lente. Attend-il donc activement que les choses soient imprimées à l'écran?
Et si cela dépend de la connexion, cela se produit-il également avec screen ou byobu par exemple? Puisqu'avec ces derniers, les programmes continuent de fonctionner même après la déconnexion de l'hôte.
Remarque: je n'ai trouvé que ces questions connexes:
ssh
tty
job-control
agold
la source
la source
Réponses:
La sortie des programmes est mise en mémoire tampon, donc si la connexion est lente, le programme sera interrompu si la mémoire tampon se remplit.
Si vous utilisez
screen
, il a également un tampon qu'il utilise pour essayer d'afficher sur une session connectée. Mais un programme connecté dans la session écran ne sera pas arrêté s'ilscreen
ne peut pas mettre à jour le terminal distant assez rapidement. Tout comme lorsqu'une connexion est perdue, le programme continue de remplir lescreens
tampon jusqu'à ce qu'il déborde (en poussant les informations les plus anciennes). Ce que vous voyez arriver (et pouvez revenir en arrière) dépend de ce qui est (toujours) dans ce tampon.screen
dissocie efficacement votre programme de votre terminal (et de votre connexion SSH lente).la source
Une connexion SSH peut mourir prématurément si la connexion TCP sous-jacente reçoit un paquet avec l' indicateur RST . Cela pourrait se produire si un côté envoie un paquet (qui pourrait être une sonde SSH périodique) mais ne reçoit pas d'accusé de réception TCP dans un délai raisonnable, ou si un routeur décide que la connexion est restée inactive trop longtemps, ou si un FAI est simplement méchant.
Dans le modèle de terminal Unix, lorsque la connexion du terminal est interrompue, le pilote de terminal envoie un signal HUP au shell, dont la terminaison entraîne également l'envoi d'un SIGHUP aux processus exécutés dans le shell.
Dans la FAQ Unix Programmer , point 1.15:
Le gestionnaire de signal par défaut pour SIGHUP consiste à terminer le processus:
Il est cependant possible d'éviter l'arrêt du processus.
Vous pouvez insérer un gestionnaire de signaux qui ignore SIGHUP. Pour ce faire en tant qu'utilisateur, encapsulez la commande dans
nohup
. Par exemple:Vous pouvez dire au shell de dissocier un processus enfant de celui-ci. Par exemple, Bash a une
disown
commande intégrée:Ensuite, le SIGHUP ne sera pas propagé à l'enfant (qui n'est plus un enfant).
sigaction(2)
), ou il pourrait choisir de rejoindre une nouvelle session (setsid(2)
).screen
outmux
, qui alloue un pseudo-TTY pour exécuter une session avec un shell qui ne reçoit pas le SIGHUP lorsque la connexion SSH s'éteint. Le SIGHUP n'est pas relayé de la session SSH à la session screen / tmux.Soit dit en passant, une autre façon de gérer les connexions SSH non fiables consiste à utiliser le protocole Mosh à la place. Mosh s'exécute sur UDP, il n'y a donc pas de connexion TCP qui risque d'être réinitialisée.
la source
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
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:
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 ...)la source