Impossibile ricollegare a una sessione dello schermo dopo l'interruzione della connessione SSH


16

Ho precedentemente ricollegato a una sessione di schermo di lunga durata con screen -dr control. Tuttavia, a volte questo comando non si ricollegherà allo schermo e si bloccherà per sempre (oltre 10 minuti dopo i quali ho interrotto). Ciò accade solo quando la connessione SSH viene interrotta in modo imprevisto e non quando lo schermo è correttamente staccato Ctrl-A d. Altri switch, come screen -xo screen -D -RRanche non funzionano.

Questo post suggerisce di uccidere il PTY che contiene la sessione dello schermo che farà sì che lo schermo completi la sua disconnessione. Tuttavia, uccide semplicemente il guscio da cui è screen -dr controlstato chiamato.

Per esempio:

$ ps -ef | grep control | grep -v grep
nomad     7387  7109  0 13:05 pts/50   00:00:00 screen -dr control
nomad    15299     1  0 Nov27 ?        00:13:47 SCREEN -S control

$ ps -ef | grep bash | grep 'pts/50'
nomad     7109  7108  0 12:49 pts/50   00:00:00 -bash

Il post collegato suggerisce di bashterminare il processo con PID 7109. Questo interromperà anche il screen -dr controlprocesso con PID 7387. Successivamente, non riesco ancora a collegarmi allo schermo.

Il processo SCREEN -S controlche ha avviato la sessione dello schermo ha initcome genitore che ovviamente non posso uccidere.

C'è un modo per ricollegarsi alla sessione dello schermo sospeso?

Aggiornamento: questo succede su CentOS 6.4 usando il kernel 2.6.32-358.6.1.el6.x86_64. Le shell sono tutte versioni bash versione 4.1.2 (1).


3
Cosa screen -lsdice in quei casi "sospesi"? screen -d -r <session>significa "staccare e recuperare", quindi non averlo rimosso di prima mano non dovrebbe importare. (E per farlo spesso, non ...)
mveroone,

Prova a eseguire lsof sui processi dello schermo, vedi se c'è qualcosa di "bloccato". Lo schermo utilizza un socket unix per comunicare tra i processi, probabilmente qualcosa lo ha tenuto aperto. Assicurati anche che il socket non sia stato cancellato o che la sua proprietà sia cambiata o qualcosa del genere. In generale dovresti anche includere quale sistema operativo e versione stai usando, anche se non ho in mente nulla di particolare che questa volta dipenderà dal sistema operativo.
Dan Pritts,

3
Stai usando un altro hop, ad es. Usando netcat come comando proxy? In questo caso ho avuto il problema in cui la connessione ssh alla prima casella si interrompe, ma il comando proxy netcat mantiene aperta una seconda connessione ssh. il -d dovrebbe funzionare comunque.
Jens Timmerman,

Jens, il tuo consiglio ha funzionato. Ho effettivamente fatto il proxy tramite netcat e ucciderlo sull'host intermedio mi ha permesso di ricollegarmi allo schermo.
Viktor Rosenfeld,

Perché dovresti voler interrompere il processo genitore del comando appeso schermo? Vuoi uccidere il comando dello schermo allegato stesso. # 7387 nel tuo caso.
Matthias Urlichs,

Risposte:


6

Penso che dovresti provare

screen -DR 

anche la prossima volta - l'invocazione arrabbiata (maiuscola) dovrebbe costringerla a disconnettere l'altra sessione che viene tenuta dal tuo netcat hop intermedio.


Ho provato questo, non funziona. Uccidere il proxy netcat fa il trucco.
Viktor Rosenfeld,

Strano. Dovrebbe. Cosa succede invece?
Matthias Urlichs,

Tutte le ulteriori invocazioni dello schermo (-dr, -x, -DR) rimangono sospese per sempre. Una volta che ho ucciso il proxy netcat, queste invocazioni funzionano di nuovo.
Viktor Rosenfeld,

1

Come suggerito da Jens Timmerman, la ragione ultima di questo strano comportamento era che mi stavo collegando al server remoto usando SSH ProxyCommand e ncat. Dopo aver ucciso il ncatcomputer intermedio, sono in grado di ricollegarmi alla sessione dello schermo.


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.