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


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


506
2017-10-21 12:09


origine


Relazionato: unix.stackexchange.com/questions/4004/... - Anton Tarasenko


risposte:


Dovresti cercare alternative moderne come tmux.

tmux è superiore a screen per molte ragioni, ecco alcuni esempi:

  • Windows può essere spostato tra le sessioni 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 accedere a una sessione

Funzionalità di base

Per ottenere la stessa funzionalità spiegata nel risposta raccomandando screen, avresti bisogno di fare quanto segue:

  • ssh nella macchina remota
  • inizio tmux digitando tmux nel guscio
  • avviare il processo che si desidera all'interno del avviato tmux sessione
  • lasciare / staccare il tmux sessione digitando Ctrl+B e poi d 

È ora possibile disconnettersi in modo sicuro dalla macchina remota, il processo continuerà a funzionare all'interno tmux. Quando torni di nuovo e vuoi controllare lo stato del tuo processo puoi usare tmux attach attaccare al tuo tmux sessione.

Se si desidera che più sessioni siano in esecuzione side-by-side, è necessario assegnare un nome a ciascuna sessione Ctrl+B e $. È possibile ottenere un elenco delle sessioni attualmente in esecuzione utilizzando tmux list-sessions, ora allega 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 dai un'occhiata man tmux o la pagina GitHub di tmux. In particolare, ecco una FAQ sulle principali differenze tra screen e tmux.


594
2017-11-23 09:26



@CraigM Use screen -x -r [screenname] o screen -rx in breve, se hai una sola sessione sullo schermo attiva. Questo ti permette di allegare un'istanza di schermo esistente. - Lekensteyn
Questo consiglio mi ha aiutato con lo stesso problema ma penso che includa un refuso. Sono abbastanza sicuro che devi digitare Ctrl-b e poi d per lasciare / staccare il tmux sessione. Certamente questo è il caso della versione di tmux sulla mia Ubuntu 12.04. - cxrodgers
Ho fatto un errore seguendo le istruzioni di cui sopra. Lo condividerò se qualcuno potrebbe cadere nello stesso errore: ho avviato tmux nella shell del mio computer invece della shell del computer remoto. È necessario avviare tmux nella shell del computer remoto. - Mert Nuhoglu
Lo schermo è ora in fase di sviluppo: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Potresti aggiornare la tua risposta? - muru
In alternativa, corri tmux detach invece di digitare ctrl-b d - Andrew MacFie


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 si desidera "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, consentendole di continuare a funzionare)

poi un rapido disown dovrebbe mantenere il processo in esecuzione dopo la disconnessione.

screen e altri possono farlo, ma non è quello per cui sono. io raccomando nohup per le attività che sai che stai per lasciare e bg per le attività già in esecuzione e non si desidera riavviare.

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


217
2017-11-28 02:58



Consiglierei di fare disown -h - Michele
interessante schermo e tmux non funziona per minatore, funziona nohup bur - Yasin Okumuş
bg + disown non ha funzionato per me Avevo uno script di distribuzione in esecuzione che mi ero dimenticato di iniziare in tmux e che dovevo partire presto per un incontro. Lo script trasmette continuamente i progressi alla shell. ctrl+z fermato il processo, restituendomi a bash. bg ha ripreso il processo, ma ha anche ripreso a trasmettere lo stato a bash, rendendo impossibile vedere cosa stavo scrivendo. Tuttavia, a disown comando prodotto "disown: current: no such job" - BrianHVB


Potresti farlo usando screen.

genere man screen per saperne di più o leggere questo pagina man di schermo.

Scenario semplice:

  • ssh nella tua casella remota. genere screen Quindi avvia il processo che desideri.

  • stampa Ctrl-UN poi Ctrl-D. Ciò "scollega" la sessione dello schermo ma lascia i processi in esecuzione. È ora possibile disconnettersi 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.


179
2017-10-21 12:20



Di solito chiamerò le mie sessioni sullo schermo usando screen -S name per facilitare la connessione a quella corretta in un secondo momento. - David Oneill
Il collegamento è giù - Gab是好人
Personalmente, sto lavorando su una scatola senza alcun software di controllo pacchetti. Dopo aver speso circa mezz'ora per costruire dipendenze per TMUX (che personalmente ho esperienza con e mi piace) dalla fonte, è diventato chiaro che lo schermo era la soluzione migliore e più semplice per me. TL; DR: la soluzione ottimale a questo problema dipende dal caso d'uso, dalla macchina e da quanto tempo occorre impostare. Grazie per questa risposta :) - Max von Hippel
Combinazione con screen -S prima di partire e screen -r quando torni è fantastico! - Meloman
Grazie per questo. Questa soluzione ha funzionato per me mentre tmux non lo faceva (io uso una versione di bash per windows mentre ssh'ing in una macchina Linux) - Michael Sorensen


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

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

Senza opzioni, rimuovi ciascuno jobspec dalla tabella dei lavori attivi. Se la -h l'opzione viene fornita, 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 nemmeno il -a né il -r l'opzione viene fornita, viene utilizzato il lavoro corrente. Se no jobspec è fornito, il -a opzione significa rimuovere o marcare tutti i lavori; il -r opzione senza a jobspec argomento limita l'operazione ai lavori in esecuzione.

Con disconoscimento è possibile chiudere il terminale e avviare il processo sulla macchina.


72
2017-10-21 13:19



Questo è anche il mio modo preferito per farlo. Uso frequentemente disown -a && exit - Stefano Palazzo♦
Perfezionare. Questa è una bella padronanza e merita tutti gli upvotes! - Greg
una parola di cautela, ho fermato un processo in esecuzione con Ctrl-Z e non l'ho avviato in background prima di chiamare disown e l'ha ucciso - HDave
Potrebbe bloccarsi se vuole scrivere sul terminale. Reindirizzare l'output di un processo in esecuzione non è così facile. Meglio avviarlo correttamente con nohup. - jiggunjer
Questa è una buona risposta, perché risponde direttamente alla domanda. L'autore della domanda ha chiesto cosa fare dopoavendo già eseguito una serie di comandi di lunga durata. La maggior parte di queste risposte ti consente di sapere cosa fare prima tu esegui i comandi. - q0rban


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

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

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 rinnegare il processo.


37
2017-11-25 03:30



I built-in sono sempre la mia prima scelta :) THX - ken_oy
Questa risposta dovrebbe essere contrassegnata come corretta. Installare e abituarsi allo schermo per risolvere questo problema è esagerato. - Ulrich-Lorenz Schlüter
Questo è molto utile quando hai già avviato un comando e che è in esecuzione a lungo. La conclusione e l'avvio in una sessione TMUX richiederà tempo - Deepali Mittal


Esistono due principali programmi che è possibile utilizzare per mantenere i programmi e lo stato terminale su più connessioni ssh. Sono schermo (l'incumbent, ma purtroppo non mantenuto. Apparentemente essendo 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 si ha 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 una macchina basata su Debian:

sudo aptitude install byobu

Usando yum, lo fai

su -c 'yum install byobu'

È anche possibile installare byobu su altre distribuzioni.

Usando byobu

Puoi iniziare byobu eseguendo byobu sulla macchina host dopo aver effettuato la connessione usando ssh. Questo ti darà una shell che assomiglia a questa:

image-byobu

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

Uso:

Iniziare byobu digitando byobu.

È possibile 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, fallo e basta byobu e tu dovresti tornare proprio dove eri.

    byobu-detach-attach

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

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


19
2017-11-24 22:09



Ho provato ad usare byobu da una sessione basata su PuTTY alla mia casella Ubuntu, ma ho ottenuto la riga di stato ripetuta e scorrente sul display. Sebbene si sia distaccato correttamente premendo F6, non era una soluzione utilizzabile nel mio setup. - jfmessier
@jfmessier È perché PuTTY non prende bene ncurses (utf-8 in pratica). È possibile eliminare questo problema seguendo questo thread - stackoverflow.com/questions/10731099/... - SiddharthaRT
Questo e spettacolare! 1. mi dà un prompt colorato di bash che non riesco a abilitare con bash come shell di default e 2. Posso eseguire 2 bot contemporaneamente e ancora avere un altro terminale su cui lavorare! @SiddharthaRT ti meriti un signore onorevole! - Dev


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

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

Lo schermo ha il vantaggio di poter essere scollegato da una macchina e ricollegarlo da un'altra, il che è utile se si desidera verificare 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ù recente. F2 per avviare un nuovo terminale F3 / F4 per spostarsi avanti e indietro e F6 per disconnettersi. Digitare exit per terminare definitivamente i terminali.


16
2017-10-21 12:16



byobu usa tmux in questi giorni .. - scottl
"Non è possibile farlo una volta avviato il processo, è necessario aver impostato le cose prima di eseguire un lavoro di lunga durata." - No, puoi usare disown Per realizzare questo. Vedi la risposta @ bassgey - Rich
dopo aver lottato per imparare schermo e tmux .... byobu mi ha fatto venire le lacrime agli occhi - HDave
disown e se necessario giusto Ctrl-z, poi bg per ottenerlo dal terminale attivo e dallo sfondo. Poi, disown. - mimoralea


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

Inoltre, se il tuo unico intermezzo è avere il processo in esecuzione e non c'è bisogno di riprenderne il controllo, e soprattutto non sei consapevole del fatto che dovrai chiudere la sessione e il processo è già in esecuzione, non sei fortunato 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 richiama il comando disown (seguito dal jobid ... stesso come con il comando bg)

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


7
2018-06-06 21:29



Questa risposta è la migliore! Perché tutti parlano di screen, la domanda è stata posta come evento post-login, come mantenere i processi in esecuzione, ora dopo l'accesso ma prima di avviarli. Ottima risposta Jorge, mi hai davvero aiutato! :) - jwbensley
Semplicemente bg (senza %1) è spesso sufficiente, poiché il valore predefinito è il lavoro corrente - Walter Tross
Sarebbe bello avere una risposta esauriente: A priori (impostazione anticipata): schermo terminale ascii (vecchio), tmux (neewer); X windows: vnc (vecchio, ancora mantenuto), xpra (più recente), con xpra che non ha radici. Un posteriore (persistente dopo l'inizio): ^ Z, rinnegare, ... Ma sono troppo pigro per rimpolpare più di questo. - Krazy Glew


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

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.


7
2017-07-29 14:58



Sì, mi piacerebbe sapere come screen / tmux sia migliore di questa semplice soluzione. - Mads Skjern
Sì, lo posso vedere anche su Ubuntu, ma non dovrebbe accadere in teoria. Non capisco perché - Daniel Pinyol
@MadsSkjern Perché non è possibile immettere alcun input nello script utilizzando questo metodo. - Ken Sharp
@MadsSkjern la ragione è che se si eseguono processi come questo con & se ci si disconnette e si accede alla sessione SSH, il processo sarà ancora in esecuzione tuttavia non sarai in grado di vedere il produzionedi quel processo (se lo script fa eco a qualcosa che non lo vedrai, ma se scrive un file il file sarà lì) - DarkCygnus


Dovresti controllare Schermo GNU e vedi 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 la avessi mai lasciata.

Come usare :

  • Usa il comando screen per la prima volta, scorrere i messaggi di introduzione, si dovrebbe essere consegnato un terminale.
  • C-a C-c apre un altro terminale
  • C-a C-k uccide un terminale
  • È possibile utilizzare C-a C-Space e C-a C-Backspace per scorrere i terminali
  • C-a C-a è utile se usi principalmente due terminali
  • C-a C-d stacca la sessione corrente dello schermo ed esce dagli schermi. È quindi possibile utilizzare screen -r per riprendere quella 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.


3
2018-05-22 15:31