Come mantenere i processi in esecuzione dopo aver terminato la sessione ssh?

500

Diciamo che lancio una serie di processi da una sessione ssh. È possibile terminare la sessione ssh mantenendo i processi in esecuzione sulla macchina remota?

    
posta Olivier Lalonde 21.10.2010 - 14:09

14 risposte

586

Dovresti cercare alternative moderne come tmux .

tmux è superiore a screen per molte ragioni, qui ci sono solo alcuni esempi:

  • Windows può essere spostato tra una sessione e anche collegato a più sessioni
  • Windows può essere diviso orizzontalmente e verticalmente in riquadri
  • Supporto per terminali a colori UTF-8 e 256
  • Le sessioni possono essere controllate dalla shell senza la necessità di inserire una sessione

Funzionalità di base

Per ottenere la stessa funzionalità spiegata nella risposta che consiglia screen , devi eseguire quanto segue:

  • ssh nella macchina remota
  • inizia tmux digitando tmux nella shell
  • avvia il processo che desideri all'interno della sessione tmux avviata
  • lascia / scollega la sessione tmux digitando Ctrl + b e quindi d

Ora puoi disconnetterti in modo sicuro dalla macchina remota, il tuo processo continuerà a funzionare in tmux . Quando torni indietro e desideri verificare lo stato del tuo processo, puoi utilizzare tmux attach per allegare alla tua sessione tmux .

Se vuoi che più sessioni si svolgano parallelamente, dovresti nominare ogni sessione usando Ctrl + b e $ . Puoi ottenere un elenco delle sessioni attualmente in esecuzione utilizzando tmux list-sessions , ora associare a una sessione in esecuzione con comando tmux attach-session -t 0 .

tmux può fare cose molto più avanzate di gestire una singola finestra in una singola sessione. Per maggiori informazioni guarda in man tmux o alla pagina GitHub di tmux . In particolare, ecco una FAQ sulle principali differenze tra screen e tmux .

    
risposta data tongpu 23.11.2012 - 10:26
211

Il modo migliore è spesso il più semplice.

nohup long-running-command &

È stato creato appositamente per questo, registra persino stdout su nohup.log

man nohup

Se vuoi "eseguire lo sfondo" di alcune attività già in esecuzione, la soluzione migliore è ctrl + z, quindi eseguire

bg (questo farà da sfondo alla tua attività sospesa più recente, permettendole di continuare a funzionare)

quindi un veloce disown dovrebbe mantenere il processo in esecuzione dopo la disconnessione.

screen e altri possono farlo, ma non è quello che servono. Raccomando nohup per le attività che ritieni di lasciare e bg per le attività già in esecuzione e che non vuoi riavviare.

Ricorda che entrambi sono bash specifici. Se non stai usando bash, i comandi potrebbero essere diversi.

    
risposta data coteyr 28.11.2012 - 03:58
178

Potresti farlo usando screen .

Digita man screen per saperne di più o leggi questa pagina man di schermo .

Scenario semplice:

  • ssh nella casella remota. Digita screen Quindi avvia il processo desiderato.

  • Premere Ctrl - A quindi Ctrl - D . Questo "staccerà" la tua sessione dello schermo ma lascerà correre i tuoi processi. Ora puoi uscire dalla casella remota.

  • Se vuoi tornare più tardi, accedi di nuovo e digita screen -r Questo "riprenderà" la sessione dello schermo e potrai vedere l'output del tuo processo.

risposta data Lincoln 21.10.2010 - 14:20
72

Screen and nohup è il modo migliore, ma se devi scollegare un processo già in esecuzione senza screen o nohup puoi eseguire il comando disown.

  

disown [-ar] [-h] [ jobspec … | pid … ]

     

Senza opzioni, rimuovi ogni jobpec dalla tabella dei lavori attivi. Se viene fornita l'opzione -h , il lavoro non viene rimosso dalla tabella, ma viene contrassegnato in modo tale che SIGHUP non venga inviato al lavoro se la shell riceve un SIGHUP. Se jobspec non è presente e non viene fornita né l'opzione -a né l'opzione -r , viene utilizzato il lavoro corrente. Se non viene fornito jobspec , l'opzione -a significa rimuovere o contrassegnare tutti i lavori; l'opzione -r senza un argomento jobspec limita l'operazione ai lavori in esecuzione.

Con il disown puoi chiudere il terminale e avviare il processo sulla macchina.

    
risposta data bassgey 21.10.2010 - 15:19
37

Ero bloccato in un grande mv quindi non ero in grado di fermare il processo, schermata di configurazione e quindi riavviarlo. Sono riuscito ad uscire dalla sessione ssh con il processo in esecuzione essenzialmente facendo i seguenti passi:

  1. ssh [server]
  2. comando
  3. CTRL + Z
  4. bg
  5. disown
  6. exit

Il passaggio 3 mette in pausa il processo corrente (ad es. il mio comando 'mv'). Il passaggio 4 mette in pausa il processo in background e lo riprende. Il passaggio 5 ti consente di annullare la procedura.

    
risposta data Chaos 25.11.2013 - 04:30
19

Esistono due programmi principali che è possibile utilizzare per mantenere i programmi e lo stato terminale su più connessioni ssh. Sono schermi (l'incumbent, ma sfortunatamente non mantenuto. Apparentemente attivamente sviluppato ora ) e tmux (più recente, mantenuto attivamente). Byobu è un front-end che può essere eseguito su questi sistemi e offre informazioni aggiuntive sullo stato di Ubuntu. Nelle nuove installazioni userà tmux come back-end, se hai una vecchia installazione di byobu e una configurazione esistente manterrà il precedente back-end, sia esso screen o tmux.

Byobu

Byobu può essere installato sul computer in questo modo in un computer basato su Debian:

sudo aptitude install byobu

Usando yum, fai

su -c 'yum install byobu'

È anche possibile installare byobu su altre distribuzioni.

Uso di byobu

È possibile avviare byobu eseguendo byobu sul computer host dopo aver effettuato il collegamento utilizzando ssh. Questo ti darà una shell simile a questa:

Puoi anche usare Byobu Terminal su una macchina Ubuntu con l'opzione -X e avere facilmente un byobu perfettamente funzionante.

Utilizzo:

Inizia byobu digitando byobu .

Puoi premere F2 per creare una nuova finestra all'interno della sessione corrente, F3-F4 per passare da una finestra all'altra.

La parte migliore di byobu è che non devi effettivamente uccidere i processi in esecuzione nel terminale per uscire dal terminale. Puoi semplicemente inviare screen / tmux (lo scheletro di byobu) allo sfondo e riprenderlo la prossima volta che vieni:

  • Per lasciare byobu e tenerlo premuto (staccare) premere F6.
  • La prossima volta che vieni, fai solo byobu e tornerai indietro dove ti trovavi.

Puoi anche creare varie sessioni byobu di byobu -S session1 e così via. E puoi collegarti a uno di questi quando torni.

Puoi fare molto di più usando Byobu. Usalo! Alcune guide definitive sono qui , qui o qui .

    
risposta data SiddharthaRT 24.11.2012 - 23:09
16

Non puoi farlo una volta avviato il processo, devi aver impostato le cose prima di eseguire un lavoro di lunga durata.

Puoi usare nohup ma la saggezza moderna ti suggerisce di usare screen o byobu come login per poter staccare e lasciare le cose in esecuzione.

Lo schermo ha il vantaggio di poterlo staccare da una macchina e ricollegarlo da un'altra, il che è utile se vuoi controllare i processi di lunga durata che vanno oltre la fine della giornata lavorativa.

C'è un inizio ragionevole guida allo schermo qui.

byobu mette un'interfaccia facile da usare sulla parte superiore dello schermo con menu, ecc. È anche l'attuale implementazione dello schermo su Ubuntu più recenti. F2 per avviare un nuovo terminale F3 / F4 per spostarsi avanti e indietro e F6 per disconnettersi. Digita exit per terminare definitivamente i terminali.

    
risposta data Richard Holloway 21.10.2010 - 14:16
7

Ehi, mentre sono d'accordo che lo schermo è l'opzione più efficace. È possibile utilizzare vncserver e quindi avviare il processo su di esso.

Anche se il tuo unico intermezzo è avere il processo in esecuzione e non c'è bisogno di riprenderne il controllo, e assolutamente più importante non eri consapevole che dovrai chiudere la sessione e il processo è già in esecuzione, non sei di fortuna se hai usato bash come shell

Per prima cosa devi inviare il processo allo sfondo digitando Ctrl + Z seguito da bg% 1 (il numero dipende dal numero del lavoro, di solito è 1, ma puoi facilmente estrarre l'elenco usando i job dei comandi)

Infine invoca il comando disown (seguito dal jobid ... stesso come con il comando bg)

Questo rimuoverà la relazione genitore-figlio tra la tua shell e il processo in background, impedendole di morire quando la tua shell è terminata.

    
risposta data Jorge Gutierrez 06.06.2011 - 23:29
7

Per uno script di shell singolo che ho eseguito per un lungo periodo di tempo, accedo e eseguo il processo in background usando '& amp;'.

Esempio:

/path/to/my/script &

Ho disconnesso e disconnesso la mia sessione SSH. Quando effettuo l'accesso in un secondo momento, lo script è ancora in esecuzione come dimostrato dalla raccolta continua dei dati dallo script.

    
risposta data user108430 29.07.2014 - 16:58
3

Dovresti controllare GNU Screen e vedere se ti aiuta. A seconda di come hai bisogno che l'applicazione venga eseguita in tempo reale, potrebbe causare più problemi di quanti ne risolva, ma almeno ti consentirà di riprendere la sessione come se non l'avessi mai lasciata.

Come usare:

  • Utilizza il comando screen per il primo avvio, fai scorrere i messaggi di introduzione, dovresti ricevere un terminale.
  • C-a C-c apre un altro terminale
  • C-a C-k uccide un terminale
  • Puoi usare C-a C-Space e C-a C-Backspace per scorrere i terminali
  • C-a C-a è utile se usi principalmente solo due terminali
  • C-a C-d rimuove la sessione corrente dello schermo ed esce dagli schermi. Puoi quindi utilizzare screen -r per riprendere la sessione. Puoi avere più sessioni di schermate separate contemporaneamente, in questo caso verrà visualizzato un elenco di sessioni disponibili.

Ci sono molte altre opzioni, ad esempio schermi divisi, e anche tutte le scorciatoie sono completamente personalizzabili.

    
risposta data T. Verron 22.05.2012 - 17:31
2

Risposta più semplice ...

ctrl + z sospenderà il programma in esecuzione

"bg" lo eseguirà in background

    
risposta data Roop 13.08.2013 - 02:28
2

Il modo più semplice è eseguire il comando in background con & . Quindi scrivi:

disown -a
    
risposta data Zibri 11.01.2017 - 04:52
0

Mentre tutti dicono di usare disown (l'unica opzione che hai dopo aver già avviato il processo), nohup , o anche eseguendo il comando in screen , che è utile se vuoi vedere tutto l'output dal comando ... Sono un fan di screen .. Ho ancora provato le distribuzioni mainstream più recenti di Linux e semplicemente inserendo il lavoro in background e abbandonando non causano la morte di tutti i processi in esecuzione. Ci deve essere un'impostazione globale o qualcosa del genere. Sto provando questo su alcuni sistemi piuttosto vecchi (slackware 12) e il mio script di test continua a funzionare finché non lo uccido manualmente:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Anche se sono d'accordo sul fatto che screen sarebbe il modo migliore per farlo, anche se il mio script ha scritto per registrare file o altro .. Non ho mai avuto bisogno di usare disown -a o nohup a meno che non fosse fuori completa paranoia. Forse qualcuno può far luce su come bash si comporta di default? Forse alcuni amministratori di sistema modificano le impostazioni predefinite su shell di grandi dimensioni per impedire ai processi degli utenti di sovraccaricare il sistema?

    
risposta data Dan Gullage 29.07.2015 - 19:42
-1

Invece di:

cmd options; 

Aggiungi prima nohup :

nohup cmd options & 

Quindi, potrai vedere lo stdout della console in:

tail -f nohup.out
    
risposta data Abdennour TOUMI 22.10.2016 - 12:51

Leggi altre domande sui tag