web-dev-qa-db-fra.com

Reprendre la commande en cours d'exécution dans une session SSH abandonnée

Lire cette question m'a fait me demander. En supposant que screen n'est pas utilisé. Si une session SSH sur une cible Linux est abandonnée, pour une raison quelconque, et que vous vous reconnectez avant que le serveur ne tue la session en raison du délai d'expiration, est-il possible de reprendre le contrôle de la commande en cours d'exécution de sorte qu'elle ne soit pas abandonnée en raison de la session interrompue ?

33
John Gardeniers

Tenter de connecter les descripteurs de fichier STD * actuels d'un nouveau terminal à un ancien processus en cours d'exécution pose simplement des problèmes. Même si vous parvenez à le faire, le contrôle des tâches du terminal ne fonctionnera pas comme prévu. Vous aurez un gâchis si vous quittez finalement le programme repris et ce qui arrive au Shell qui a sacrifié ses descripteurs de fichiers pour être remis au processus nouvellement mis en arrière-plan. Est-ce que ssh restera ouvert lorsque ce Shell disparaîtra? Probablement pas. Vous devrez donc d'abord le rediriger ailleurs.

Possible ou non, je parierais qu'il est plus souhaitable de laisser le processus abandonné être tué "naturellement". Si vous faites quelque chose d'assez important pour justifier d'essayer de faire tout le piratage nécessaire pour reprendre le contrôle et vous êtes sur un lien instable, vous devriez probablement le savoir à l'avance et utiliser simplement screen (ou vnc , ou tout ce qui fait flotter votre bateau indépendant). :)

13
dannysauer

Je sais que c'est une vieille question, mais j'estimais qu'il était important d'ajouter mes conclusions au cas où quelqu'un d'autre trouverait cela comme moi.

Je n'ai pas vu de conséquences inhabituelles à faire cela oui, mais c'est ce que j'ai utilisé et cela a fonctionné de manière incroyable. Parfois, lorsque nous exécutons de longs processus sur notre serveur, cela déconnecte parfois la session ssh. Le processus avec la session tty semble continuer mais nous ne pouvons pas nous reconnecter. J'ai trouvé le programme ci-dessous pour tirer le processus vers la session nouvellement connectée.

https://github.com/nelhage/reptyr

Voici plus d'informations

https://blog.nelhage.com/2011/02/changing-ctty/

5
user215086

Généralement, la bonne façon de gérer cela est de s'y préparer à l'avance, en utilisant les mécanismes GNU screen ou bash's Nohup ou disown Si vous utilisez tcsh, le shell désactive les tâches d'arrière-plan lorsqu'il se ferme anormalement.

Si vous n'utilisez pas screen mais avez réussi à faire fonctionner votre processus via l'une des méthodes désactivées , vous pourrez peut-être fausse reconnexion au processus avec gdb ( source ):

[...] avec quelques hacks sales, il n'est pas impossible de rouvrir un processus stdout/stderr/stdin. [...]

Et puis utilisez gdb par exemple pour vous attacher au processus, appelez close (0)
fermeture d'appel (1)
fermeture d'appel (2)
appel ouvert ("/ dev/pts/xx", ...)
appel dup (0)
appel dup (0)
détacher

Maintenant, vous devez modifier ce processus pour votre situation. Je doute que cela aiderait si vous n'avez pas réussi à renier le processus. Si vous utilisez bash, voir cet article sur la création automatique de bash désavouer les processus d'arrière-plan à la sortie (en gros, désactiver huponexit avec shopt ). Avec un processus de premier plan, vous devez avoir utilisé Nohup .

4
quack quixote

Probablement pas. Je ne peux pas garantir que c'est impossible mais j'en doute vraiment.

Une chose est le manque de tuer le shell et les commandes possibles s'exécutant à la suite de la fin de la connexion ssh. Ce n'est pas si difficile, vous devriez pouvoir utiliser Nohup et des mécanismes similaires comme mentionné dans l'autre question.

Mais alors, supposez que vous avez commencé ssh somehost nuhup vim /some/file et la connexion s'éteint. Vous courez ssh somehost pour vous reconnecter et constater que votre processus vim est toujours en cours d'exécution. Mais alors, comment vous connectez-vous à nouveau à ce processus? Les processus interactifs forground ont un contrôle tty et celui ouvert pour votre processus vim lors de son démarrage aurait depuis été fermé. Je ne sais pas s'il existe un moyen de le "rouvrir" à nouveau dans votre nouveau Shell (tout comme si vous avez plusieurs tâches d'arrière-plan en cours d'exécution dans un Shell, vous ne pouvez pas mettre en avant celles de l'autre Shell).

Screen ont été explicitement écrits pour avoir cette fonctionnalité. Au démarrage, il bifurque deux processus, un processus de gestion de terminal et un processus client. L'interaction est l'application <--> gestionnaire de terminaux <--> client, et lorsque vous vous déconnectez ou perdez la connexion, le processus client meurt pendant que le gestionnaire de terminaux continue de vivre. Screen a un support spécifique à rattacher plus tard au processus de gestion des terminaux, et je ne pense pas que ce soit possible dans le cas général.

1
hlovdal

retty pourrait être en mesure de vous aider, mais les clauses de non-responsabilité sont très réelles et pertinentes :)

1
Evan Broder

Si session est abandonné, cela signifie TTL est déjà expiré, donc il n'y a plus de terminal pour vous (si je comprends bien). Mais, si votre connexion réseau est interrompue, votre session SSH n'a peut-être pas besoin d'être interrompue et vous devriez pouvoir reprendre votre connexion et continuer. Est-ce ce que vous demandez?

1
monomyth

Il y avait un lien vers un code de vol tty hacky dans cette question . Vous devriez théoriquement pouvoir l'utiliser pour reprendre le contrôle d'un processus Nohup.

0
Kamil Kisiel