GNU/Linux >> Tutoriels Linux >  >> Linux

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

Solution 1 :

Tenter de connecter les descripteurs de fichiers STD* actuels d'un nouveau terminal à un ancien processus en cours d'exécution ne fait que créer des ennuis. 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 pris en charge, et ce qui arrive au shell qui a sacrifié ses descripteurs de fichiers pour être remis au processus nouvellement en arrière-plan. SSH restera-t-il 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 simplement laisser le processus abandonné se faire tuer "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 utilisez simplement screen (ou vnc, ou tout ce qui flotte sur votre bateau de contrôle détaché). :)

Solution 2 :

Je sais que c'est une vieille question, mais j'ai pensé qu'il était important d'ajouter mes conclusions au cas où quelqu'un d'autre tomberait dessus 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é à merveille. Parfois, lorsque nous exécutons de longs processus sur notre serveur, cela déconnecte occasionnellement la session ssh. Le processus et la session tty semblent continuer à fonctionner, mais nous ne pouvons pas nous y 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/

Solution 3 :

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

Si vous n'utilisez pas screen mais avez réussi à maintenir votre processus en cours d'exécution via l'un des disown méthodes, vous pourrez peut-être simuler une reconnexion au processus avec gdb (source):

[...] certains 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, faites quelque chose appelez close(0)
clôture d'appel(1)
fermer l'appel(2)
call open("/dev/pts/xx", ...)
appel dup(0)
appel dup(0)
détacher

Maintenant, vous devrez ajuster ce processus à votre situation. Je doute que cela vous aide si vous n'avez pas réussi à renier le processus. Si vous utilisez bash , voir ce post sur la création de bash désavouer automatiquement processus d'arrière-plan à la sortie (en gros, désactivez huponexit avec boutique ). Avec un processus de premier plan, vous devez avoir utilisé nohup .


Linux
  1. 4 façons de maintenir une commande en cours d'exécution après la déconnexion de la session SSH

  2. Ssh - Continuer à exécuter les processus après la déconnexion de la session Ssh ?

  3. Comment afficher la sortie d'un processus en cours d'exécution dans une autre session Bash ?

  4. Comment tuer la ligne de commande Chromium sur Ssh ?

  5. Continuer à exécuter un programme Python même après la déconnexion de la session Ssh ?

Commande Pstree sous Linux

Commande Kill sous Linux

Commande SSH

Commande d'écran Linux :Maintenir les processus en cours d'exécution malgré une connexion interrompue

Reptyr - Déplacer un processus en cours d'exécution d'un terminal à un autre sans le fermer

Comment savoir depuis combien de temps un processus s'exécute sous Linux