Mantieni attive le sessioni SSH dopo la disconnessione


208

A volte ho processi a lungo in esecuzione che voglio dare il via prima di andare a casa, quindi creo una sessione SSH sul server per avviare il processo, ma poi voglio chiudere il mio laptop e tornare a casa e più tardi, dopo cena, voglio controlla il processo che ho iniziato prima di lasciare il lavoro. Come posso farlo con SSH? La mia comprensione è che se si interrompe la connessione SSH, si interromperà anche la sessione di accesso sul server, uccidendo quindi il processo di lunga durata.

Risposte:


205

Utilizzare nohupper fare in modo che il processo ignori il segnale di riaggancio:

$ nohup long-running-process &
$ exit

20
Questo è. Non è necessario installare screen o tmux. Questo è in realtà il buon vecchio modo di farlo. Sicuramente 'schermo' o 'tmux' sono entrambe app meravigliose e dovrebbero essere utilizzate quando necessario, ma semplici come eseguire un processo in background da cui è possibile disconnettersi, andare sopra.
Reiche,

2
nohup è come rinnegato?
cjac,

28
Hanno scopi simili, ma differiscono in molti modi. nohupintercetta SIGHUP in modo che quando la shell che ha eseguito si chiude e invia SIGHUP a tutti i suoi figli ancora in esecuzione, long-running-processnon muore. disownrimuove semplicemente il lavoro specificato dall'elenco figlio di Bash, quindi non tenterà affatto di inviare SIGHUP. nohupè un programma separato dalla shell, quindi funziona con tutte le shell, mentre disownè incorporato in Bash. nohupaccetta il comando da eseguire, mentre disownfunziona solo dopo l'avvio del lavoro e dopo averlo messo in background in modo da poter tornare alla shell.
Warren Young,

3
Fantastica recensione rapida per coloro che non hanno familiarità con nohup e disconoscimento, nonché alcuni modi semplici per gestire le sessioni terminali serverwatch.com/tutorials/article.php/3935306/…
Dan

7
tail -f nohup.outper controllare cosa succede quando torni.
Ricardo Stuven,

141

Vuoi usare GNU Screen. È fantastico!

ssh me@myserver.com
screen               #start a screen session
run-a-long-process

CTRL+ a, dper staccare dalla sessione dello schermo

exit                 #disconnect from the server, while run-a-long-process continues

Quando torni sul tuo laptop:

ssh me@myserver.com
screen -r            #resume the screen session

Quindi controlla l'avanzamento del tuo processo di lunga durata!

screenè uno strumento molto completo e può fare molto di più di quello che ho descritto. Durante una sessione dello schermo, prova ctrl + a ,? per imparare alcuni comandi comuni. Probabilmente i più comuni sono:

  • CTRL+ a, cper creare una nuova finestra
  • CTRL+ a, nper passare alla finestra successiva nella sessione dello schermo
  • CTRL+ a, pper passare alla finestra precedente nella sessione dello schermo
  • se accedi da un gruppo di sistemi diversi, potresti esserti accidentalmente lasciato collegato a una sessione di schermo attiva su un altro computer. per questo motivo, riprendo sempre con screen -d -rper assicurarmi che se un'altra shell è collegata alla mia sessione dello schermo, verrà staccata prima di riprenderla sul mio sistema attuale.

8
tmux è un moderno analogo dello schermo.
zvolkov,

Non so del moderno, ma il prefisso chiave predefinito di tmux (Ctrl + b) aiuta se sei abituato a bash / emacs.
sajith

2
lo schermo è piuttosto bello se vuoi un terminale condiviso per qualche motivo. Crea uno schermo screen -S namee lascia che l'altro tuo amico si colleghi ad esso screen -x name.
Patrick,

1
tmuxcon tmuxinatorè un'ottima combinazione per configurazioni fantasiose, mentre preferisco screenuna soluzione rapida e semplice.
earthmeLon

Questa risposta è la migliore .. Mi piace. Ottima ricerca
Jaffer Wilson,

42

Se non hai pianificato in anticipo screen, impostato , ecc. Procedi come segue:

  1. Se il processo è in esecuzione in background: vai a # 3, altrimenti: Ctrl-Zper sospendere il processo in primo piano. Questo riporterà il numero di processo del processo sospeso, ad esempio:

    [1]+  Stopped                 processName
    
  2. Invia processNamein background con bg %1(usando qualunque sia il numero di lavoro che segue %). Questo riprenderà processNamein background.

  3. Rinuncia processName con disown %1o disown PID. Utilizzare la -hbandiera se si desidera mantenere la proprietà fino a quando non si termina la shell corrente.


5
Grazie per questo! Avevo un lavoro in esecuzione e pensavo che non sarei stato in grado di farlo andare avanti perché non l'avevo usato &quando l'ho avviato. Questo sembra funzionare alla grande!
Matt

4
Questo è fantastico! Non ho mai saputo che Linux potesse permetterti di trasferire il controllo di processi attivi come questo. Temevo che la mia batteria si sarebbe esaurita mentre SSH si trovava nel mio server nel corso di un lungo processo, e questa è stata la risposta per me!
Plutone,

14

Quello che vuoi usare è screen o ancora meglio un wrapper intuitivo attorno allo schermo chiamato byobu.

Lo schermo consente di eseguire più sessioni di terminale virtuale nella stessa sessione ssh. Sono disponibili un tutorial e pagine di aiuto .

byobu è un wrapper che consente di aprire facilmente nuove schermate con un semplice tasto funzione anziché la combinazione di tasti da ctrl-a. Mostra anche una linea di stato con tutti i terminali virtuali aperti che possono essere nominati.

Un'altra caratteristica interessante è il fatto che tutto lo schermo può rimanere in piedi mentre la connessione ssh è disconnessa. Ti connetti di nuovo via ssh e chiama byobu e tutto è come prima.

Finalmente alcuni screenshot di Byobu.


Ho avviato un processo sul mio server all'interno di Byobu Terminal senza sapere davvero cosa fosse (ho appena cercato Terminal e ho cliccato su Byobu perché non l'avevo mai visto prima). Ho continuato a usare Byobu perché aveva una barra di stato colorata in basso e ho pensato che fosse bello. Oggi mi sono ritrovato a voler accedere a quella sessione terminale da remoto tramite SSH. Tutto quello che dovevo fare era digitare "byobu" e mostrava subito quella sessione terminale. Davvero felice di essermi imbattuto in byobu!
nick

8

Vale la pena notare che

ssh -t lala screen -rxU moosi collegherà alla sessione moo su host lala

ssh -t lala screen -S moocreerà la sessione moo su host lala

e

ssh -t lala screen -S moo quuxcreerà la sessione moo su host lala ed eseguirà il programma quux , chiudendo la sessione al completamento.


3

Vecchia domanda, strano ancora nessuno lo ha consigliato a tmux , che funge da involucro per n console e le tiene aperte fino al momento del bisogno. Ciò consente un maggiore controllo, oltre a una serie di funzioni che tmux ha. È facile gestirlo, esegui semplicemente tmux, che ti porta nella sua shell, avvia il tuo lavoro looong, quindi premi ctrl + b seguito da d (stacca) ( ctrl+bè il "ok google" di tmux, ed dè il comando per chiudere senza uscita dalla shell). Questo in realtà funziona se si chiude, ad esempio, lo stucco. Dopo cena, quando ti riconnetti, puoi riaprire tmux con tmux attachper vedere lo schermo esattamente come te ne sei andato. Qualcosa che adoro è dividere il riquadro: ctrl+be quindi premere ". Per passare da un riquadro all'altro, ctrl+bquindi premere la freccia su / giù.


3

Puoi trovare una buona guida qui: mantieni attiva la sessione SSH quando ti disconnetti

sudo apt-get install screen

Ora puoi avviare una nuova sessione schermo semplicemente digitando schermo dalla riga di comando. Ti verranno mostrate alcune informazioni sullo schermo. Premi invio e sarai al prompt normale.

Per disconnettersi (ma lasciare la sessione in esecuzione) Premere Ctrl+ Ae quindi Ctrl+ Din successione immediata. Vedrai il messaggio [distaccato]

Per riconnettersi a una sessione già in esecuzione

screen -r

Per riconnettersi a una sessione esistente o crearne una nuova se non esiste

screen -D -r

Per creare una nuova finestra all'interno di una sessione dello schermo in esecuzione Hit Ctrl+ Ae quindi Cin successione immediata. Vedrai un nuovo prompt.

Per passare da una finestra dello schermo a un'altra Hit Ctrl+ Ae quindi Ctrl+ Ain successione immediata.

Per elencare le finestre dello schermo aperto, premi Ctrl+ Ae poi Win successione immediata


È possibile utilizzare <kbd>Ctrl</kbd>per mostrare i nomi come tasti della tastiera.
Tomasz,

1

Uso NX NoMachine, che è gratuito per me perché sono solo io. In sostanza, esegue una sessione X sul server a cui è possibile connettersi e disconnettersi ripetutamente. La sessione X continua a essere eseguita quando non sei connesso. Le connessioni possono essere effettuate ovunque. Puoi scegliere tra finestre mobili o una singola finestra contenente un intero desktop (ad esempio un desktop Gnome completo). Il client (che eseguiresti sul tuo laptop) può essere eseguito su Linux, MacOS, Solaris o Microsoft Windows. In quest'ultimo caso, se si scelgono finestre mobili, queste vengono visualizzate singolarmente sulla barra delle applicazioni di Windows.

Uso il mio laptop Windows XP (di cui ho bisogno per determinati hardware specifici di Windows che ho) come front-end per i miei due server Linux usando NX Nomachine. Posso persino stampare sulla stampante collegata al mio laptop Windows da Linux.

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.