Comment récupérer un shell après une déconnexion

37

Je travaille sur une machine distante CentOS 5.6 et mon réseau ne cesse de chuter. Existe-t-il un moyen de récupérer mes sessions bloquées après ma reconnexion?

EDIT: je fais des mises à jour et des installations avec yum et crains que cela ne soit un problème si les processus restent au centre de leurs activités.

Jeff Schaller
la source
6
tmux ou écran.
Voir

Réponses:

63

Il n'y a aucun moyen, mais pour éviter cela, j'aime utiliser tmux. Je lance tmux, lance l'opération et continue mon chemin. Si je reviens et trouve que la connexion a été rompue, tout ce que j'ai à faire est de vous reconnecter et de taper tmux attach.

Voici un exemple.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion
Braiam
la source
ne pas avoir tmux, et je ne suis pas autorisé à installer des choses qui ne figurent pas sur ma liste de choses à faire ...
5
@sergio Mon coeur saigne :-)) Utilisez screen.
4
@sergio Sur un système Unix, pratiquement toutes les applications ne nécessitant pas d'autorisations root peuvent être installées dans leur répertoire de base.
Kusalananda
35

Les recommandations pour tmux et screen sont toutes deux de bonnes suggestions. Ils impliquent la réponse à votre question, mais ne le déclarez pas réellement. La réponse à la question est: il n'y a aucun moyen. Si vous vous connectez via ssh, le shell est terminé lorsque la connexion est interrompue. La solution consiste à vous connecter et à démarrer immédiatement un terminal virtuel (tel que tmux). Lorsque la connexion est interrompue, le shell dans lequel vous vous trouvez est terminé, mais vous pouvez en ouvrir un nouveau et vous reconnecter au terminal virtuel (qui exécute le shell dans lequel vous effectuez réellement votre travail.)

William Pursell
la source
D'accord. c'est clair maintenant.
En supposant que le processus yum soit toujours en cours d'exécution (ne s'est pas immédiatement terminé lorsque le shell est devenu SIGHUP), reptyr ou similaire pourrait suffire à récupérer le processus ou, à défaut, à obtenir une sortie future. Le shell serait généralement terminé à la déconnexion, cependant.
Eroen
@Eroen Vous voulez dire, même si vous utilisez tmux, le système d'exploitation mettra fin au processus tmux une fois qu'il aura constaté que la connexion est perdue?
Dojo
@Dojo Une fois la connexion terminée, l'instance de tmux est arrêtée, mais la session tmux (et les shells qu'elle gère) reste active.
William Pursell
Si l'utilisateur a perdu la connexion au serveur ssh distant, par exemple parce qu'il a soudainement débranché le câble RJ-45, je pense que le serveur ssh conserve cette session jusqu'à l'expiration d'un délai d'attente prédéfini (120 secondes par exemple). Donc, dans ce cas, y a-t-il un moyen de reprendre cette session qui est toujours vivante côté serveur ssh dans les 120 secondes suivant le débranchement du câble?
Gab
8

Comme William l'a dit, la réponse courte est non, il n'y a aucun moyen. Pour éviter cela, vous pouvez utiliser la commande screen avant de perdre la connexion.

Nicholas Smith
la source
D'après ce que j'ai compris, je devrais avoir initié miam avec l'écran ... welll, je ne l'ai pas fait. Je ne peux pas relancer miam, il dit que c'est toujours utilisé et que je ne veux pas le forcer à le tuer. ..comment puis-je reprendre le contrôle de la course yum?
et byobu est un bon complément à screen, pour qu'il soit lancé automatiquement dans un joli terminal graphique launchpad.net/byobu
Autant que je sache, vous ne pouvez pas le faire, à moins qu'il existe un moyen caché de rediriger le résultat de la commande yum vers votre session de session actuelle, mais je ne peux en penser à personne.
Nicholas Smith
Il existe un certain nombre de solutions partielles à cela en utilisant les débogueurs, etc. donner à un processus un nouveau shell parent. Reptyr en est un, et un article de blog décrit le problème, la solution de contournement et certaines autres implémentations.
Eroen
3

Non, vous ne pouvez pas récupérer un shell après une déconnexion. Au lieu de cela, vous pouvez vous assurer que la commande que vous avez exécutée continue de s'exécuter après la déconnexion.

Pour ce faire, utilisez les commandes "nohup" et "désaveu", qui sont généralement des commandes intégrées à la plupart des shells, c’est-à-dire que vous n’aurez rien à installer. Cela ne fonctionne cependant que pour les commandes non interactives.

Ainsi, les étapes seraient les suivantes:

  1. Se connecter au serveur
  2. Exécutez votre commande: "nohup sudo yum update &" (cela enregistrera également toutes les sorties dans le fichier nohup.out de votre répertoire actuel)
  3. Exécuter "désapprouver% 1"
  4. N'hésitez pas à vous déconnecter à ce stade ou attendez d'être déconnecté :)

Lorsque vous revenez sur le serveur, cliquez simplement sur "tail nohup.out" pour voir comment se comporte la commande.

zygis
la source
Cela ne fonctionnerait-il pas assez mal dans le cas général ? Par exemple, avec des commandes qui veulent être entrées à un moment ou à un autre ... Pour des commandes complètement non interactives, cela peut fonctionner assez bien et éviter les frais généraux d'un multiplexeur de terminal (et éventuellement l'installation de celui-ci).
un CVn
Oui, cela ne fonctionne que si vos commandes ne veulent aucune entrée d'utilisateur, j'ai mis à jour la réponse. Globalement, un multiplexeur de terminal est la solution, mais il a été mentionné qu'aucun outil supplémentaire n'était autorisé à être installé.
Zygis
Absolument, c'est une réponse valide, juste légèrement limitée dans ses cas d'utilisation possibles. Upvote avec l'édition.
un CVn
3

Quelqu'un a ajouté reptyr dans un commentaire plutôt que dans une réponse, je ne peux donc pas y revenir, mais cela semble être une bonne réponse à la question modifiée et a très bien fonctionné sous CentOS.

voir: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Existe-t-il un moyen de récupérer mes sessions bloquées après ma reconnexion?

EDIT: je fais des mises à jour et des installations avec yum et crains que cela ne soit un problème si les processus restent au centre de leurs activités.

Donc même chose, j'ai perdu la connexion à distance à une session de mise à jour yum. Alors j'ai cherché et trouvé cette question ... puis reconnecté et utilisé l'écran cette fois:

  1. reconnecter ssh
  2. écran
  3. installer reptyr selon les liens ci-dessus
  4. ps -a | grep miam
  5. reptyr psid

et me voilà à l’invite retrouvée que miam donnait quelques heures plus tôt.

Techniquement, toutes les réponses sont correctes, il ne s’agit PAS d’une récupération d’une session bloquée, c’est de la reconstitution d’un processus orphelin de la session en cours. Et très utile c'est aussi ...

Ingleno
la source
1

Comme beaucoup de gens ont suggéré screenet tmux, ils fonctionnalités de base à la fois de support, mais ont des caractéristiques spécifiques de distinctes, donc on ne peut pas dire que l' un est supérieur à l' autre dans tous les cas. Par exemple, seul tmux prend en charge le fractionnement de la fenêtre , alors que seul l’écran GNU peut basculer le retour à la ligne long avec (Ctrl + ar). Voir comparaison plus détaillée ici .

Il existe également des outils spécifiques pour résoudre ce problème de ssh:

Autossh est un programme permettant de démarrer une copie de ssh et de la surveiller, en la redémarrant si nécessaire au cas où celle-ci mourrait ou cesserait de passer du trafic. L'idée est de rstunnel.

Mosh est une application de terminal à distance qui permet l'itinérance, prend en charge la connectivité intermittente et fournit une modification intelligente de l'écho local et de la ligne des touches des utilisateurs. Mosh remplace SSH. Il est plus robuste et réactif, en particulier via les liaisons Wi-Fi, cellulaires et longue distance.

Yaroslav Nikitenko
la source
-1

Cela peut être fait en utilisant tmuxshell. Si vous êtes déconnecté, le moyen le plus rapide de rattacher une session est:

tmux a #0
cmcginty
la source
Cela n'ajoute rien que la réponse acceptée ne dit pas. Cela suppose également que l'utilisateur a déjà une tmuxsession en cours d'exécution.
Kusalananda
2
Cela pourrait être un commentaire sur cette réponse en disant « vous pouvez abrégez attachcomme a».
Jeff Schaller