5 façons de maintenir les sessions et les processus SSH à distance en cours d'exécution après la déconnexion
SSH ou Secure Shell en termes simples est un moyen par lequel une personne peut accéder à distance à un autre utilisateur sur un autre système, mais uniquement en ligne de commande, c'est-à-dire en mode non graphique. En termes plus techniques, lorsque nous nous connectons à un autre utilisateur sur un autre système et exécutons des commandes sur cette machine, cela crée en fait un pseudo-terminal et l'attache au shell de connexion de l'utilisateur connecté.

Lorsque nous nous déconnectons de la session ou que la session expire après avoir été inactive pendant un certain temps, le signal SIGHUP est envoyé au pseudo-terminal et tous les travaux qui ont été exécutés sur ce terminal, même les travaux dont les travaux parents sont lancés sur le pseudo-terminal reçoivent également le signal SIGHUP et sont forcés de se terminer.
Seuls les travaux qui ont été configurés pour ignorer ce signal sont ceux qui survivent à la fin de la session. Sur les systèmes Linux, nous pouvons avoir plusieurs façons d'exécuter ces travaux sur le serveur distant ou sur n'importe quelle machine, même après la déconnexion de l'utilisateur et la fin de la session.
Comprendre les processus sous Linux
Processus normal
Les processus normaux sont ceux qui ont une durée de vie d'une session. Ils sont démarrés pendant la session en tant que processus de premier plan et se terminent dans un certain laps de temps ou lorsque la session est déconnectée. Ces processus ont pour propriétaire n'importe quel utilisateur valide du système, y compris root.
Processus orphelin
Les processus orphelins sont ceux qui avaient initialement un parent qui a créé le processus mais après un certain temps, le processus parent est mort ou s'est écrasé involontairement, faisant d'init le parent de ce processus. De tels processus ont init comme parent immédiat qui attend ces processus jusqu'à ce qu'ils meurent ou finissent.
Processus démon
Ce sont des processus intentionnellement orphelins, ces processus qui sont intentionnellement laissés en cours d'exécution sur le système sont appelés démons ou processus intentionnellement orphelins. Ce sont généralement des processus de longue durée qui sont une fois lancés puis détachés de tout terminal de contrôle afin qu'ils puissent s'exécuter en arrière-plan jusqu'à ce qu'ils ne soient pas terminés ou finissent par générer une erreur. Le parent de tels processus meurt intentionnellement en faisant exécuter l'enfant en arrière-plan.
Techniques pour maintenir la session SSH en cours d'exécution après la déconnexion
Il peut y avoir plusieurs façons de laisser les sessions ssh en cours d'exécution après la déconnexion, comme décrit ci-dessous :
1. Utilisation de la commande screen pour maintenir les sessions SSH en cours d'exécution
screen est un gestionnaire de fenêtres de texte pour Linux qui permet à l'utilisateur de gérer plusieurs sessions de terminal en même temps, de basculer entre les sessions, de se connecter pour les sessions en cours d'exécution à l'écran et même de reprendre la session à tout moment. sans vous soucier de la déconnexion de la session ou de la fermeture du terminal.
les sessions d'écran peuvent être démarrées puis détachées du terminal de contrôle en les laissant s'exécuter en arrière-plan, puis être reprises à tout moment et même en tout lieu. Il vous suffit de démarrer votre session sur l'écran et quand vous le souhaitez, de le détacher du pseudo-terminal (ou du terminal de contrôle) et de vous déconnecter. Lorsque vous vous sentez, vous pouvez vous reconnecter et reprendre la session.
Démarrage d'une session d'écran
Après avoir tapé la commande 'screen', vous serez dans une nouvelle session d'écran, dans cette session, vous pouvez créer de nouvelles fenêtres, passer d'une fenêtre à l'autre, verrouiller l'écran et faire bien d'autres choses que vous pouvez faire sur une borne normale.
$ screen

Une fois la session d'écran démarrée, vous pouvez exécuter n'importe quelle commande et maintenir la session en cours en la détachant.

Détacher un écran
Juste au moment où vous voulez vous déconnecter de la session à distance, mais que vous voulez garder la session que vous avez créée sur cette machine en vie, alors ce que vous devez faire est de détacher l'écran du terminal afin qu'il n'y ait plus de terminal de contrôle. Après cela, vous pouvez vous déconnecter en toute sécurité.
Pour détacher un écran du terminal distant, appuyez simplement sur \Ctrl+a
immédiatement suivi de \d”
et vous serez de retour sur le terminal en voyant le message qui l'écran est détaché. Vous pouvez maintenant vous déconnecter en toute sécurité et votre session restera active.

Reprise de la session d'écran détaché
Si vous souhaitez reprendre une session d'écran détachée que vous avez quittée avant de vous déconnecter, reconnectez-vous simplement au terminal distant et tapez \screen -r
au cas où un seul écran serait ouvert, et si plusieurs sessions screen sont ouvertes, exécutez \screen -r
.
$ screen -r $ screen -r <pid.tty.host>

Pour en savoir plus sur la commande screen et son utilisation, suivez simplement le lien : Utiliser la commande screen pour gérer les sessions de terminal Linux
2. Utilisation de Tmux (multiplexeur de terminaux) pour maintenir les sessions SSH en cours d'exécution
Tmux est un autre logiciel créé pour remplacer screen. Il possède la plupart des fonctionnalités de screen, avec quelques fonctionnalités supplémentaires qui le rendent plus puissant que screen.
Il permet, en plus de toutes les options offertes par screen, de diviser les volets horizontalement ou verticalement entre plusieurs fenêtres, de redimensionner les volets de fenêtre, de surveiller l'activité de la session, de créer des scripts en utilisant le mode ligne de commande, etc. Grâce à ces fonctionnalités de tmux, il a été largement adopté par près de toutes les distributions Unix et même il a été inclus dans le système de base d'OpenBSD.
Démarrer une session Tmux
Après avoir fait ssh sur l'hôte distant et tapé tmux, vous entrerez dans une nouvelle session avec une nouvelle fenêtre s'ouvrant devant vous, dans laquelle vous pourrez faire tout ce que vous faites sur un terminal normal.
$ tmux

Après avoir effectué vos opérations sur le terminal, vous pouvez détacher cette session du terminal de contrôle afin qu'elle passe en arrière-plan et que vous puissiez vous déconnecter en toute sécurité.

Détacher la session Tmux du terminal
Soit vous pouvez exécuter \tmux detach
lors de l'exécution de la session tmux, soit vous pouvez utiliser le raccourci (Ctrl+b puis d)
. Après cela, votre session actuelle sera détachée et vous reviendrez à votre terminal d'où vous pourrez vous déconnecter en toute sécurité.
$ tmux detach

Reprise de la session Tmux fermée
Pour rouvrir la session que vous avez détachée et laissée telle quelle lorsque vous vous êtes déconnecté du système, reconnectez-vous simplement à la machine distante et tapez \tmux attach pour vous rattacher à la session fermée et il sera toujours là et en cours d'exécution.
$ tmux attach

Pour en savoir plus sur tmux et son utilisation, suivez simplement le lien : Utiliser Tmux Terminal Multiplexer pour gérer plusieurs terminaux Linux.
3. Utilisation de la commande nohup pour continuer à exécuter des sessions SSH
Si vous n'êtes pas familier avec screen ou tmux, vous pouvez utiliser nohup et envoyer votre longue commande en arrière-plan afin que vous puissiez continuer pendant que la commande continuera à s'exécuter en arrière-plan. Après cela, vous pouvez vous déconnecter en toute sécurité.
Avec la commande nohup, nous disons au processus d'ignorer le signal SIGHUP qui est envoyé par la session ssh à la fin, rendant ainsi la commande persistante même après la déconnexion de la session. Lors de la déconnexion de la session, la commande est détachée du terminal de contrôle et continue de s'exécuter en arrière-plan en tant que processus démon.
Exécution d'une commande à l'aide de nohup en arrière-plan
Voici un scénario simple dans lequel nous avons exécuté la commande find pour rechercher des fichiers en arrière-plan sur une session ssh à l'aide de nohup, après quoi la tâche a été envoyée en arrière-plan avec une invite de retour donnant immédiatement PID et le travail ID du processus ([JOBID] PID)
.
# nohup find / -type f $gt; files_in_system.out 2>1 &

Reprise de la session pour voir si le travail est toujours en cours d'exécution
Lorsque vous vous reconnectez, vous pouvez vérifier l'état de la commande, la ramener au premier plan en utilisant fg %JOBID
pour surveiller sa progression, etc. Ci-dessous, la sortie indique que la tâche est terminée car elle ne s'affiche pas lors de la reconnexion et a donné la sortie qui est affichée.
# fg %JOBID

4. Utilisation de la commande disown pour maintenir les sessions SSH en cours d'exécution
Une autre façon élégante de laisser votre commande ou une seule tâche s'exécuter en arrière-plan et de rester active même après la déconnexion ou la déconnexion de la session consiste à utiliser disown.
Disown, supprime la tâche de la liste des tâches de processus du système, de sorte que le processus ne soit pas tué lors de la déconnexion de la session car il ne recevra pas SIGHUP par le shell lorsque vous vous déconnectez.
L'inconvénient de cette méthode est qu'elle ne doit être utilisée que pour les tâches qui ne nécessitent aucune entrée de la part de stdin et qui n'ont pas non plus besoin d'écrire dans stdout, sauf si vous redirigez spécifiquement travaux d'entrée et de sortie, car lorsque le travail tentera d'interagir avec stdin ou stdout, il s'arrêtera.
Exécution de la commande en utilisant disown en arrière-plan
Ci-dessous, nous avons envoyé la commande ping en arrière-plan afin qu'ut continue de fonctionner et soit supprimé de la liste des tâches. Comme on l'a vu, la tâche a d'abord été suspendue, après quoi elle figurait toujours dans la liste des tâches sous le nom Process ID : 15368.
$ ping linux-console.net > pingout & $ jobs -l $ disown -h %1 $ ps -ef | grep ping

Après que ce signal de désaveu a été transmis au travail, il a été supprimé de la liste des travaux, bien qu'il fonctionnait toujours en arrière-plan. Le travail serait toujours en cours d'exécution lorsque vous vous reconnecterez au serveur distant, comme indiqué ci-dessous.
$ ps -ef | grep ping

5. Utilisation de la commande setsid pour exécuter des sessions SSH
Un autre utilitaire pour obtenir le comportement requis est setsid. Nohup présente un inconvénient dans le sens où le groupe de processus du processus reste le même, de sorte que le processus exécuté avec nohup est vulnérable à tout signal envoyé à l'ensemble du groupe de processus (comme Ctrl + C
).
setsid, d'autre part, alloue un nouveau groupe de processus au processus en cours d'exécution et, par conséquent, le processus créé est totalement dans un groupe de processus nouvellement alloué et peut s'exécuter en toute sécurité sans crainte d'être tué même après la déconnexion de la session.
Exécutez n'importe quelle commande en utilisant setsid
Ici, cela montre que le processus ‘sleep 10m’
a été détaché du terminal de contrôle, depuis sa création.
$ setsid sleep 10m $ ps -ef | grep sleep

Maintenant, lorsque vous vous reconnecterez à la session, vous trouverez toujours ce processus en cours d'exécution.
$ ps -ef | grep [s]leep

Conclusion
À quelles façons pourriez-vous penser pour maintenir votre processus en cours d'exécution même après vous être déconnecté de la session SSH ? S'il existe un autre moyen efficace auquel vous pouvez penser, mentionnez-le dans vos commentaires.