Recherche de site Web

5 façons de maintenir les sessions et 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 GUI. 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.

À ne pas manquer : 5 pratiques utiles pour assurer la sécurité et la protection du serveur SSH

Seules les tâches configurées pour ignorer ce signal sont celles qui survivent à la fin de la session. Sur les systèmes Linux, nous pouvons disposer de plusieurs façons d'exécuter ces tâches 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 tout 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 se terminent.

Processus démon

Il s'agit de 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. Il s'agit généralement de 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, obligeant l'enfant à s'exécuter en arrière-plan.

Techniques pour maintenir la session SSH en cours d'exécution après la déconnexion

Il existe différentes manières 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 texte pour Linux qui permet à l'utilisateur de gérer plusieurs sessions de terminal en même temps, de basculer entre les sessions, d'enregistrer les sessions en cours à 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, les laissant s'exécuter en arrière-plan et ensuite ê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 la détacher du pseudo-terminal (ou du terminal de contrôle) et de vous déconnecter. Lorsque vous le ressentez, vous pouvez vous reconnecter et reprendre la session.

Démarrer une session d'écran

Après avoir tapé la commande 'screen', vous serez dans une nouvelle session d'écran. Dans cette session, vous pourrez créer de nouvelles fenêtres, parcourir les fenêtres, verrouiller l'écran et faire bien d'autres choses que vous pouvez faire sur un terminal normal.

screen

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

Détacher un écran

Juste au moment où vous souhaitez vous déconnecter de la session à distance, mais que vous souhaitez conserver la session que vous avez créée sur cette machine, il vous suffit de détacher l'écran du terminal afin qu'il ne reste 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 au terminal en voyant le message que 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é 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 les sessions d'écran sont ouvertes, exécutez « screen -r ».

screen -r
screen -r <pid.tty.host>

Pour en savoir plus sur la commande screen et comment l'utiliser, suivez simplement le lien : Utiliser la commande screen pour gérer les sessions de terminal Linux

2. Utilisation de Tmux (Terminal Multiplexer) 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 capacités de screen, avec quelques fonctionnalités supplémentaires qui le rendent plus puissant que screen.

Il permet, outre 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é des sessions, de créer des scripts en 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 celle-ci a été incluse dans le système de base d'OpenBSD.

Démarrer une session Tmux

Après avoir exécuté 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 en cours 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 reconnecter à la session fermée et elle sera toujours là et fonctionnera.

tmux attach

Pour en savoir plus sur tmux et comment l'utiliser, suivez simplement le lien : Utiliser le multiplexeur de terminal Tmux pour gérer plusieurs terminaux Linux.

3. Utilisation de la commande nohup pour continuer à exécuter des sessions SSH

Si vous n'êtes pas très familier avec screen ou tmux, vous pouvez utiliser nohup et envoyer votre commande de longue durée en arrière-plan afin de pouvoir continuer pendant 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, faisant ainsi persister la commande même après la déconnexion de la session. Lors de la déconnexion de la session, la commande est supprimée du terminal de contrôle et continue de s'exécuter en arrière-plan en tant que processus démon.

Exécution de la commande en utilisant 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 lors d'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 immédiate donnant le 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 reconnecterez, vous pourrez vérifier l'état de la commande, la remettre au premier plan en utilisant 'fg %JOBID' pour surveiller sa progression, etc. Ci-dessous, la sortie montre que le travail a été terminé car il ne s'affiche pas lors de la reconnexion et a donné le résultat qui est affiché.

fg %JOBID

4. Utilisation de la commande disown pour maintenir les sessions SSH en cours d'exécution

Une autre manière élégante de laisser votre commande ou une tâche unique s'exécuter en arrière-plan et rester active même après la déconnexion ou la déconnexion de la session consiste à utiliser disown.

Disown, supprime le travail de la liste des travaux de processus du système, de sorte que le processus est protégé contre l'arrêt 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 stdin et qui n'ont pas non plus besoin d'écrire sur stdout, sauf si vous redirigez spécifiquement entrées et sorties des jobs, car lorsque le job essaie d'interagir avec stdin ou stdout, il s'arrête.

Exécution de la commande en utilisant le désaveu en arrière-plan

Ci-dessous, nous avons envoyé la commande ping en arrière-plan afin qu'elle continue de s'exécuter et soit supprimée de la liste des tâches. Comme nous l'avons vu, la tâche a d'abord été suspendue, après quoi elle figurait toujours dans la liste des tâches sous le numéro ID de processus : 15368.

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

Après que ce signal de désaveu ait été transmis au travail, celui-ci a été supprimé de la liste des travaux, bien qu'il soit toujours exécuté en arrière-plan. Le travail serait toujours en cours d'exécution lorsque vous vous reconnecteriez au serveur distant, comme indiqué ci-dessous.

ps -ef | grep ping

5. Utilisation de la commande setsid pour exécuter les sessions SSH

Un autre utilitaire permettant d'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éé se trouve 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

Désormais, lorsque vous vous reconnecterez à la session, vous constaterez toujours que ce processus est en cours d'exécution.

ps -ef | grep [s]leep

Conclusion

À quelles façons pourriez-vous penser pour que votre processus continue de fonctionner même après vous être déconnecté de la session SSH ? Si vous pouvez penser à un autre moyen efficace, mentionnez-le dans vos commentaires.