Comment me reconnecter à un écran perdu (socket détaché, manquant)?

23

J'ai eu une screensession en cours d'exécution sur un serveur domestique. Mon poste de travail avait besoin d'un redémarrage, alors j'ai détaché et tué le terminal. Lors de la reconnexion au serveur, j'exécute mon

$ screen -D -R
[new screen]

Hein? Non, pas une nouvelle session, donnez-moi l'ancienne. Je sais, je vais le saisir directement. Quel est le nom du socket?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

Attends quoi? Je sais que je l'ai laissé tourner. Où est-il allé?

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

Eh bien, il y a le processus. Mais il n'y a pas de prise sur laquelle passer screen -r. Comment rattacher ma session?

Quack Quichotte
la source

Réponses:

28

Screenvérifie le fifo / socket chaque fois qu'il reçoit un SIGCHLDsignal. Si le socket est manquant, il sera recréé. La solution consiste donc à trouver le processus et à l'envoyer SIGCHLD.

Sur mon système Debian, screensemble être installé en tant que setgid utmpmais pas setuid, donc la première solution de la FAQ ci-dessous a fonctionné:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

Sur les systèmes où screen est installé setuid root, cela ne fonctionnera pas, et vous devrez tuer l'un des processus enfants de la session screen active pour forcer le noyau à envoyer le signal pour vous. Cela signifie sacrifier l'une de vos fenêtres d'écran pour vous reconnecter au reste (choisissez judicieusement!).

À partir d'une FAQ Gentoo Wiki archivée :

Prise manquante

Parfois, le socket d'un écran en cours d'exécution peut être détruit, bien que le processus réel et tous ses processus enfants soient toujours en cours d'exécution. écran -list affiche « Aucune Sockets trouvée dans / tmp / uscreens / .. » Quelques instructions pratiques sur la façon de se remettre de cette (et quelques autres problèmes hors du commun) à http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC environ 2/3 de la descente.

Q: Pour une raison inconnue, le fifo dans / tmp / screens / S-myname a disparu et je ne peux pas reprendre ma session d'écran. Existe-t-il un moyen de recréer le fifo?

R: L' écran vérifie le fifo / socket chaque fois qu'il reçoit un signal SIGCHLD. S'il manque, le fifo / socket est alors recréé.

Si l'écran fonctionne sans set-uid, l'utilisateur peut kill -CHLD screenpiddirectement émettre un (c'est -CHILDsur certains systèmes). Screenpid est l'ID de processus du processus d'écran trouvé dans une ps -xliste.

Mais généralement, cela ne fonctionnera pas, car l'écran doit être installé root setuid. Dans ce cas, vous ne pourrez pas lui envoyer de signal, mais le noyau le fera. Il le fait chaque fois qu'un enfant d'écran change d'état. Trouvez l'ID de processus (shellpid ci-dessous) du shell "le moins important" exécuté à l'intérieur de l'écran. L'essai kill -STOP shellpid. Si le fifo / socket ne réapparaît pas, détruisez le processus shell. Vous sacrifiez un obus pour sauver le reste. Si rien ne fonctionne, n'oubliez pas de supprimer tous les processus en cours d'exécution dans la session d'écran perdue.

Quack Quichotte
la source