Come riconnettersi a uno schermo smarrito (scollegato, presa mancante)?


23

Ho avuto una screensessione in esecuzione su un server di casa. La mia workstation aveva bisogno di un riavvio, quindi ho staccato e ucciso il terminale. Al momento della riconnessione al server, eseguo il mio tipico

$ screen -D -R
[new screen]

Eh? No, non una nuova sessione, dammi quella vecchia. Lo so, lo prenderò direttamente. Come si chiama il socket?

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

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

Aspetta cosa? So di averlo lasciato in esecuzione. Dove è andato?

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

Bene, c'è il processo. Ma non c'è socket a cui passare screen -r. Come posso ricollegarmi alla mia sessione?

Risposte:


28

Screencontrolla il fifo / socket ogni volta che riceve un SIGCHLDsegnale. Se manca il socket, verrà ricreato. Quindi la soluzione è trovare il processo e inviarlo SIGCHLD.

Sul mio sistema Debian, screensembra essere installato come setgid utmpma non setuid, quindi la prima soluzione dalle FAQ qui sotto ha funzionato:

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

Sui sistemi in cui lo schermo è installato setuid root, questo non funzionerà e dovrai interrompere uno dei processi figlio della sessione dello schermo attiva per forzare il kernel a inviare il segnale per te. Questo significa sacrificare una delle finestre dello schermo per riconnetterti con il resto (scegli saggiamente!).

Da una FAQ archiviata su Gentoo Wiki :

Presa mancante

A volte il socket di uno schermo ancora in esecuzione può essere distrutto, sebbene il processo reale e tutti i suoi processi figlio siano ancora in esecuzione. screen-list mostrerà "Nessun socket trovato in / tmp / uscreens / .." Alcune utili istruzioni su come recuperare da questo (e alcuni altri problemi non comuni) su http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC circa 2/3 della discesa.

D: Per qualche ragione sconosciuta, il file in / tmp / screens / S-myname è sparito e non riesco a riprendere la sessione dello schermo. C'è un modo per ricreare il FIFO?

A: Lo schermo controlla il fifo / socket ogni volta che riceve un segnale SIGCHLD. Se mancante, viene ricreato il fifo / socket.

Se lo schermo è in esecuzione non impostato, l'utente può emettere kill -CHLD screenpiddirettamente un (è -CHILDsu alcuni sistemi). Screenpid è l'ID di processo del processo dello schermo trovato in un ps -xelenco.

Ma di solito questo non funziona, poiché lo schermo dovrebbe essere installato setuid root. In questo caso non sarai in grado di inviargli un segnale, ma lo farà il kernel. Lo fa ogni volta che un figlio dello schermo cambia stato. Trova l'id di processo (shellpid di seguito) della shell "meno importante" in esecuzione all'interno dello schermo. Il tentativo kill -STOP shellpid. Se il fifo / socket non riappare, distruggere il processo di shell. Sacrifichi un guscio per salvare il resto. Se non funziona nulla, non dimenticare di rimuovere tutti i processi in esecuzione nella sessione schermata persa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.