Solution 1 :
Modifier pour 2016 :
Ce Q&A est antérieur à la débâcle de systemd v230. À partir de systemd v230, la nouvelle valeur par défaut consiste à tuer tous les enfants d'une session de connexion qui se termine, quelles que soient les précautions historiquement valables prises pour empêcher cela. Le comportement peut être modifié en définissant KillUserProcesses=no
en /etc/systemd/logind.conf
, ou contourné à l'aide des mécanismes spécifiques à systemd pour démarrer un démon dans l'espace utilisateur. Ces mécanismes sortent du cadre de cette question.
Le texte ci-dessous décrit comment les choses ont traditionnellement fonctionné dans l'espace de conception UNIX depuis plus longtemps que Linux n'existe.
Ils seront tués, mais pas nécessairement immédiatement. Cela dépend du temps qu'il faut au démon SSH pour décider que votre connexion est morte. Ce qui suit est une explication plus longue qui vous aidera à comprendre comment cela fonctionne réellement.
Lorsque vous vous êtes connecté, le démon SSH vous a alloué un pseudo-terminal et l'a attaché au shell de connexion configuré de votre utilisateur. C'est ce qu'on appelle le terminal de contrôle. Chaque programme que vous démarrez normalement à ce stade, quel que soit le nombre de couches de coques profondes, retracera finalement son ascendance jusqu'à cette coque. Vous pouvez observer cela avec le pstree
commande.
Lorsque le processus démon SSH associé à votre connexion décide que votre connexion est morte, il envoie un signal de raccrochage (SIGHUP
) au shell de connexion. Cela informe le shell que vous avez disparu et qu'il doit commencer à nettoyer après lui-même. Ce qui se passe à ce stade est spécifique au shell (recherchez dans sa page de documentation "HUP"), mais pour la plupart, il commencera à envoyer SIGHUP
pour exécuter les travaux qui lui sont associés avant de se terminer. Chacun de ces processus, à son tour, fera ce qu'il est configuré pour faire à la réception de ce signal. Habituellement, cela signifie mettre fin. Si ces emplois ont leurs propres emplois, le signal sera souvent également transmis.
Les processus qui survivent à un raccrochage du terminal de contrôle sont ceux qui se sont soit dissociés d'avoir un terminal (processus démons que vous avez démarrés à l'intérieur de celui-ci), soit ceux qui ont été invoqués avec un préfixe nohup
commande. (c'est-à-dire "ne raccrochez pas") Les démons interprètent le signal HUP différemment ; comme ils n'ont pas de terminal de contrôle et ne reçoivent pas automatiquement un signal HUP, il est plutôt réutilisé comme une demande manuelle de l'administrateur pour recharger la configuration. Ironiquement, cela signifie que la plupart des administrateurs n'apprennent l'utilisation "raccrochée" de ce signal pour les non-démons que bien, bien plus tard. C'est pourquoi vous lisez ceci !
Les multiplexeurs de terminaux sont un moyen courant de conserver votre environnement shell intact entre les déconnexions. Ils vous permettent de vous détacher de vos processus shell de manière à pouvoir vous y rattacher ultérieurement, que cette déconnexion soit accidentelle ou délibérée. tmux
et screen
sont les plus populaires ; la syntaxe pour les utiliser dépasse le cadre de votre question, mais elles valent la peine d'être examinées.
On m'a demandé de préciser combien de temps il faut au démon SSH pour décider que votre connexion est morte. Il s'agit d'un comportement spécifique à chaque implémentation d'un démon SSH, mais vous pouvez compter sur chacun d'eux pour se terminer lorsque l'un ou l'autre côté réinitialise la connexion TCP. Cela se produira rapidement si le serveur tente d'écrire sur le socket et que les paquets TCP ne sont pas reconnus, ou lentement si rien ne tente d'écrire sur le PTY.
Dans ce contexte particulier, les facteurs les plus susceptibles de déclencher une écriture sont :
- Un processus (généralement celui au premier plan) tentant d'écrire sur le PTY côté serveur. (serveur->client)
- L'utilisateur tentant d'écrire sur le PTY côté client. (client->serveur)
- Keepalives de toute sorte. Celles-ci ne sont généralement pas activées par défaut, ni par le client ni par le serveur, et il existe généralement deux types :au niveau de l'application et basé sur TCP (c'est-à-dire
SO_KEEPALIVE
). Keepalives revient à ce que le serveur ou le client envoie rarement des paquets de l'autre côté, même lorsque rien n'aurait autrement de raison d'écrire sur le socket. Bien que cela soit généralement destiné à contourner les pare-feu qui expirent trop rapidement les connexions, cela a pour effet secondaire supplémentaire de faire remarquer à l'expéditeur que l'autre côté ne répond pas beaucoup plus rapidement.
Les règles habituelles pour les sessions TCP s'appliquent ici :s'il y a une interruption de la connectivité entre le client et le serveur, mais qu'aucun côté ne tente d'envoyer un paquet pendant le problème, la connexion survivra à condition que les deux côtés répondent ensuite et reçoivent le TCP attendu. numéros de séquence.
Si un côté a décidé que le socket est mort, les effets sont généralement immédiats :le processus sshd enverra HUP
et s'auto-termine (comme décrit précédemment), sinon le client notifiera l'utilisateur du problème détecté. Il convient de noter que ce n'est pas parce qu'une partie pense que l'autre est morte que l'autre en a été informé. Le côté orphelin de la connexion restera généralement ouvert jusqu'à ce qu'il tente d'y écrire et expire ou reçoive une réinitialisation TCP de l'autre côté. (si la connectivité était disponible à ce moment-là) Le nettoyage décrit dans cette réponse ne se produit qu'une fois que le serveur a remarqué.
Solution 2 :
Comme d'autres l'ont mentionné, une fois que vous vous déconnectez de ssh, tout ce qui s'y exécute est parti.
Comme @Michael Hampton et d'autres l'ont mentionné, vous pouvez utiliser des outils comme tmux
ou screen
pour se déconnecter/se reconnecter aux terminaux sans perdre leur contenu (c'est-à-dire les processus enfants).
De plus, vous pouvez mettre un processus en arrière-plan en utilisant une esperluette &
puis utilisez la commande disown
pour les dissocier du shell courant.
# start a command
% sleep 5000 &
[1] 3820
# check it
% jobs
[1]+ Running sleep 5000 &
# disown everything
% disown -a
# check it again (gone from shell)
% jobs
%
# but it's still running on the system
% ps -eaf|grep "[s]leep"
saml 3820 23791 0 00:16 pts/1 00:00:00 sleep 5000
%
Solution 3 :
Non, tous les programmes encore attachés au terminal et non placés en arrière-plan avec quelque chose comme nohup
, serait tué.
C'est pourquoi il existe des solutions de terminaux virtuels comme tmux
et l'ancien screen
qui créent des sessions qui continuent de fonctionner même si vous êtes déconnecté, et auxquelles vous pouvez vous reconnecter plus tard.