110 votes

La déconnexion d'une session SSH tue-t-elle vos programmes ?

Donc, disons que je suis déconnecté d'une session SSH après avoir lancé rsync o cp ou toute autre commande qui peut être longue. Cette commande continue-t-elle à fonctionner jusqu'à ce qu'elle soit terminée après que j'ai été déconnecté ou est-elle simplement tuée ?

Je me suis toujours posé cette question.

0 votes

Je veux juste ajouter à ce qui a été dit plus haut que, si vous vous trouvez dans une situation où vous avez besoin de mettre un processus déjà en cours d'exécution en screen essayez. reptyr .

0 votes

Ça va tuer vos programmes. Très ennuyeux si vous mettez à jour la version du système d'exploitation de Ubuntu 16.04 à 17.10 via SSH.

130voto

Édition pour 2016 :

Ces questions et réponses sont antérieures au débâcle de systemd v230 . À partir de systemd v230, le nouveau défaut est de tuer tous les enfants d'une session de connexion qui se termine, quelles que soient les précautions historiquement valables prises pour éviter cela. Ce comportement peut être modifié en définissant KillUserProcesses=no en /etc/systemd/logind.conf ou contourné en utilisant les mécanismes spécifiques au système pour démarrer un démon en espace utilisateur. Ces mécanismes sont en dehors de la portée 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 a alloué un pseudo-terminal pour vous et l'a attaché au login configuré de votre utilisateur Shell. C'est ce qu'on appelle le terminal de contrôle. Chaque programme que vous démarrez normalement à partir de ce moment, peu importe le nombre de couches de shells, remontera finalement à ce Shell. Vous pouvez observer cela avec la fonction pstree commandement.

Lorsque le processus démon SSH associé à votre connexion décide que votre connexion est morte, il envoie un signal de raccrochage ( SIGHUP ) au login Shell. Cela notifie 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 à Shell (recherchez "HUP" dans sa page de documentation), mais pour l'essentiel, elle commencera à envoyer SIGHUP aux travaux en cours qui lui sont associés avant de se terminer. Chacun de ces processus, à son tour, fera ce qu'il a été configuré pour faire à la réception de ce signal. En général, cela signifie se terminer. Si ces tâches ont leurs propres tâches, le signal sera souvent transmis également.

Les processus qui survivent à un blocage du terminal de contrôle sont ceux qui se sont dissociés du terminal (processus démons que vous avez démarrés à l'intérieur du terminal), ou ceux qui ont été invoqués avec le préfixe nohup commande. (Les démons interprètent le signal HUP différemment ; puisqu'ils ne disposent pas d'un terminal de contrôle et ne reçoivent pas automatiquement un signal HUP, celui-ci est transformé en une demande manuelle de l'administrateur pour recharger la configuration. Ironiquement, cela signifie que la plupart des administrateurs n'apprennent que beaucoup, beaucoup plus tard l'usage "hangup" de ce signal pour les non-daemons. C'est pourquoi vous lisez ceci !

Les multiplexeurs de terminaux sont un moyen courant de garder votre environnement Shell intact entre deux 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 ait été 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 il vaut la peine de s'y intéresser.


On m'a demandé de préciser le temps que met le démon SSH à 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 tous ces démons 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 dans le socket et que les paquets TCP ne sont pas reconnus, ou lentement si rien ne tente d'écrire dans le PTY.

Dans ce contexte particulier, les facteurs les plus susceptibles de déclencher une écriture sont les suivants :

  • Un processus (généralement celui en avant-plan) tente d'écrire dans le PTY du côté serveur. (serveur->client)
  • L'utilisateur tente d'écrire dans le PTY du côté client. (client->serveur)
  • Keepalives de toute sorte. Ils ne sont généralement pas activés par défaut, que ce soit par le client ou par le serveur, et il en existe deux types : au niveau de l'application et au niveau du protocole TCP (c.-à-d. SO_KEEPALIVE ). Les "keepalives" consistent à ce que le serveur ou le client envoie rarement des paquets à l'autre partie, même lorsque rien n'aurait autrement une raison d'écrire sur la socket. Bien que cette pratique soit généralement destinée à contourner les pare-feu qui interrompent les connexions trop rapidement, elle a pour effet secondaire de permettre à l'expéditeur de remarquer plus rapidement que l'autre partie ne répond pas.

Les règles habituelles des sessions TCP s'appliquent ici : s'il y a une interruption de la connectivité entre le client et le serveur, mais qu'aucun des deux côtés ne tente d'envoyer un paquet pendant le problème, la connexion survivra à condition que les deux côtés soient réactifs par la suite et reçoivent les numéros de séquence TCP attendus.

Si l'une des parties a décidé que la socket est morte, les effets sont généralement immédiats : le processus sshd enverra HUP et s'arrêtera d'elle-même (comme décrit précédemment), ou le client informera l'utilisateur du problème détecté. Il convient de noter que le fait qu'un côté pense que l'autre est mort ne signifie pas 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 s'arrête, ou qu'il 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 n'a lieu qu'une fois que le côté orphelin de la connexion a été supprimé. serveur a remarqué.

0 votes

dtach L'url est ici : dtach.sourceforge.net

2 votes

Excellente explication. Je me sens déjà plus linuxey !

4 votes

De plus, bien que cela ne fasse pas techniquement partie de votre réponse, voici un petit détail intéressant : vous pouvez utiliser la fonction kill -HUP comme racine pour forcer le terminal de quelqu'un à raccrocher. Vous ne devriez pas faire ça sans raison valable. Je l'utilise surtout lorsque des utilisateurs laissent des shells ouverts pendant la maintenance et que je dois démonter un système de fichiers que leur Shell garde ouvert. Si l'utilisateur est connecté mais en phase terminale d'inactivité, envoyez le signal à son processus sshd. Sinon, s'il tourne à l'intérieur d'un multiplexeur de terminal, envoyez-le au Shell que vous voulez arrêter. Ne raccrochez que le Shell qui vous empêche de travailler !

25voto

nex3 Points 4309

Comme d'autres l'ont mentionné, une fois que vous vous déconnectez de ssh, tout ce qui fonctionne à l'intérieur de celui-ci disparaît.

Comme @Michael Hampton et d'autres ont mentionné que vous pouvez utiliser des outils comme tmux o screen pour se déconnecter/se reconnecter aux terminaux sans perdre leur contenu (c'est-à-dire les processus enfants).

En outre, vous pouvez mettre un processus en arrière-plan en utilisant une esperluette & et ensuite utiliser la commande disown pour les dissocier avec le Shell actuel.

# 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
%

0 votes

Est-il possible de rattacher une session de terminal à une disown Le processus d'élaboration ?

4 votes

Oui. Voir cette question U&L pour plus de détails : unix.stackexchange.com/questions/4034/

15voto

Michael Hampton Points 232226

Non, tout programme encore attaché au terminal, et non placé en arrière-plan avec quelque chose comme nohup serait tué.

C'est pourquoi il existe des solutions de terminaux virtuels comme tmux et les plus âgés screen qui créent des sessions qui continuent à fonctionner même si vous êtes déconnecté, et auxquelles vous pouvez vous rattacher ultérieurement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X