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.