Come recuperare una shell dopo una disconnessione


37

Sto lavorando su una macchina remota CentOS 5.6 e la mia rete continua a cadere. C'è un modo per recuperare le mie sessioni sospese dopo la riconnessione?

EDIT: sto facendo un po 'di aggiornamento e installazione con yum e sono preoccupato che questo potrebbe essere un problema se i processi continuano a rimanere sospesi nel mezzo di qualsiasi cosa stiano facendo.


6
tmux o schermo.
vedi il

Risposte:


63

Non c'è modo, ma per evitare questo mi piace usare tmux. Inizio tmux, inizio l'operazione e proseguo per la mia strada. Se ritorno e scopro che la connessione è stata interrotta, tutto ciò che devo fare è riconnettermi e digitare tmux attach.

Ecco un esempio

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

non ho tmux e non posso installare cose che non sono nella mia lista di cose da fare ...

5
@sergio Il mio cuore sanguina :-)) Usa screen.

4
@sergio Su un sistema Unix, virtualmente qualsiasi applicazione che non richiede i permessi di root può essere installata nella propria directory home.
Kusalananda

35

I consigli per tmux e screen sono entrambi buoni suggerimenti. Implica la risposta alla tua domanda, ma in realtà non la afferma. La risposta alla domanda è: non c'è modo. Se si accede tramite ssh, la shell termina quando la connessione si interrompe. La soluzione è quella di accedere e avviare immediatamente un terminale virtuale di qualche tipo (come tmux). Quando la connessione si interrompe, la shell in cui ci si trova è terminata, ma è possibile aprire una nuova shell e riconnettersi al terminale virtuale (che esegue la shell in cui si sta effettivamente facendo il proprio lavoro).


Ok. è chiaro ora.

Supponendo che il processo yum sia ancora in esecuzione (non si è interrotto immediatamente quando la shell ha ricevuto SIGHUP), reptyr o simili potrebbero essere sufficienti per ripristinare il processo o, in mancanza, ottenere qualsiasi output futuro. La shell sarebbe generalmente terminata al momento della disconnessione.
Eroen,

@Eroen Intendi, anche se si utilizza tmux, il sistema operativo interromperà il processo tmux quando rileva che la connessione è andata persa?
Dojo,

@Dojo Al termine della connessione, l'istanza tmux verrà arrestata, ma la sessione tmux (e le shell che gestisce) rimarranno attive.
William Pursell,

Se l'utente ha perso la connessione al server remoto ssh perché, ad esempio, ha improvvisamente scollegato accidentalmente il cavo RJ-45, penso che il server ssh mantenga questa sessione fino a un timeout predefinito (120 secondi, ad esempio). Quindi, in questo caso, c'è un modo per riprendere questa sessione che è ancora attiva sul lato server SSH entro 120 secondi dalla disconnessione del cavo?
Gab 是 好人

8

Come ha detto William, la risposta breve è no, non c'è modo. Per evitare ciò, è possibile utilizzare il comando screen prima di perdere la connessione


da quello che ho capito, avrei dovuto iniziare yum con lo schermo ... beh, non l'ho fatto. non riesco a ripetere che dice che è ancora in uso e non voglio forzarlo ad ucciderlo. ..come posso riprendere il controllo dello yum in esecuzione?

e byobu è un bel complemento dello schermo, per farlo lanciare automaticamente in un bel terminale grafico launchpad.net/byobu

Per quanto ne so non puoi, a meno che non ci sia un modo nascosto per reindirizzare l'output del comando yum nella sessione corrente del termine, ma non riesco a pensare a uno fuori dalla mia testa.
Nicholas Smith,

Esistono diverse soluzioni parziali a questo tramite debugger ecc. per dare a un processo una nuova shell genitore. Reptyr è uno di questi e un post sul blog descrive il problema, la soluzione alternativa e alcune altre implementazioni.
Eroen,

3

No, non è possibile ripristinare una shell dopo una disconnessione. Invece, ciò che puoi fare è assicurarti che il comando che stavi eseguendo continui a essere eseguito dopo la disconnessione.

Per ottenere ciò, usa i comandi "nohup" e "disown", che di solito sono comandi integrati sulla maggior parte delle shell, cioè non è necessario installare nulla. Questo funziona solo con comandi non interattivi.

Quindi, i passaggi sarebbero i seguenti:

  1. Accedi al server
  2. Esegui il comando: "nohup sudo yum update &" (questo registra anche tutto l'output nel file nohup.out nella directory corrente)
  3. Esegui "disown% 1"
  4. Sentiti libero di disconnetterti a questo punto o attendi di essere disconnesso :)

Quando torni al server, semplicemente "tail nohup.out" per vedere come sta andando il comando.


Non funzionerebbe abbastanza male nel caso generale ? Ad esempio, con comandi che desiderano input in un momento o nell'altro ... Per comandi completamente non interattivi, potrebbe funzionare abbastanza bene ed evitare il sovraccarico (e forse la necessità di installare) un multiplexer terminale.
un CVn

Sì, questo funziona solo se i tuoi comandi non vogliono alcun input dell'utente, ho aggiornato la risposta. Nel complesso un terminale multiplexer è sicuramente la strada da percorrere, ma è stato menzionato che non è stato possibile installare strumenti aggiuntivi.
Zygis,

Assolutamente, è una risposta valida, leggermente limitata nei suoi possibili casi d'uso. Eseguito l'upgrade con la modifica.
un CVn il

3

Qualcuno ha aggiunto reptyr in un commento piuttosto che una risposta, quindi non posso votarlo, ma sembra una buona risposta alla domanda modificata e ha funzionato benissimo su CentOS.

vedi: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

C'è un modo per recuperare le mie sessioni sospese dopo la riconnessione?

EDIT: sto facendo un po 'di aggiornamento e installazione con yum e sono preoccupato che questo potrebbe essere un problema se i processi continuano a rimanere sospesi nel mezzo di qualsiasi cosa stiano facendo.

Quindi stessa cosa, ho perso la connessione remota a una sessione di aggiornamento yum. Quindi ho cercato e trovato questa domanda ... quindi questa volta ho ricollegato e usato lo schermo:

  1. ricollegare ssh
  2. schermo
  3. installa reptyr secondo i link sopra
  4. ps -a | grep yum
  5. reptyr psid

ed eccomi al prompt recuperato che yum stava dando alcune ore prima.

Tecnicamente le risposte sono tutte corrette, questo NON è un recupero di una sessione sospesa, sta riparando un processo orfano alla sessione corrente. E molto utile è anche ...


1

Come molte persone hanno suggerito screene tmux, entrambi supportano funzionalità di base, ma hanno caratteristiche specifiche distinte, quindi non si può dire che uno sia superiore all'altro in tutti i casi. Ad esempio, solo tmux supporta la suddivisione delle finestre , mentre solo lo schermo GNU può attivare / disattivare il ritorno a capo con (Ctrl + ar). Vedi un confronto più dettagliato qui .

Esistono anche strumenti specifici per risolvere questo problema di ssh:

Autossh è un programma per avviare una copia di ssh e monitorarlo, riavviandolo se necessario in caso di interruzione o interruzione del traffico. L'idea è di rstunnel.

Mosh è un'applicazione terminale remota che consente il roaming, supporta la connettività intermittente e fornisce un'eco locale intelligente e la modifica della linea delle sequenze di tasti dell'utente. Mosh è un sostituto di SSH. È più robusto e reattivo, soprattutto tramite collegamenti Wi-Fi, cellulari e interurbani.


-1

Questo può essere fatto usando la tmuxshell. Se vieni disconnesso, il modo più veloce per ricollegare una sessione è:

tmux a #0

Questo non aggiunge nulla che la risposta accettata non dice. Presuppone inoltre che l'utente abbia già una tmuxsessione in esecuzione.
Kusalananda

2
Questo potrebbe essere un commento su quella risposta che dice "puoi abbreviare attachcome a".
Jeff Schaller
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.