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


Risposte:


750

Dovresti cercare alternative moderne come tmux.

tmuxè superiore a screenper molte ragioni, ecco alcuni esempi:

  • Windows può essere spostato tra le sessioni e persino collegato a più sessioni
  • Le finestre possono essere divise 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 entrare in una sessione

Funzionalità di base

Per ottenere la stessa funzionalità descritta nella raccomandazione di rispostascreen , è necessario effettuare le seguenti operazioni:

  • ssh nella macchina remota
  • inizia tmuxdigitando tmuxnella shell
  • avviare il processo desiderato all'interno della tmuxsessione avviata
  • lasciare / staccare la tmuxsessione digitando Ctrl+ be quindid

Ora puoi disconnetterti in modo sicuro dal computer remoto, il processo continuerà all'interno tmux. Quando torni di nuovo e desideri controllare lo stato del processo, puoi utilizzarlo tmux attachper collegarti alla tmuxsessione.

Se si desidera avere più sessioni in esecuzione fianco a fianco, è necessario assegnare un nome a ciascuna sessione utilizzando Ctrl+ be $. È possibile ottenere un elenco delle sessioni attualmente in esecuzione utilizzando tmux list-sessions, ora allegare a una sessione in esecuzione con il comando tmux attach-session -t 0.

tmuxpuò fare cose molto più avanzate rispetto a gestire una singola finestra in una singola sessione. Per maggiori informazioni date un'occhiata in man tmuxo la pagina di GitHub tmux . In particolare, ecco una FAQ sulle principali differenze tra screene tmux.


4
@CraigM Utilizzare screen -x -r [screenname]o screen -rxin breve se è attiva solo una sessione dello schermo. Ciò consente di allegare un'istanza di schermo esistente.
Lekensteyn,

5
Questo consiglio mi ha aiutato con lo stesso problema, ma penso che includa un refuso. Sono abbastanza sicuro che è necessario digitare Ctrl-be quindi dper uscire / staccare la tmuxsessione. Certamente questo è il caso della versione di tmuxUbuntu 12.04.
Cxrodgers,

17
Ho fatto un errore seguendo le istruzioni sopra. Lo condividerò se qualcuno potesse cadere nello stesso errore: ho iniziato a lavorare sulla shell del mio computer invece che sulla shell del computer remoto. È necessario avviare tmux nella shell del computer remoto.
Mert Nuhoglu,

5
Lo schermo è ora in fase di sviluppo: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Potresti aggiornare la tua risposta?
muru,

4
In alternativa, esegui tmux detachinvece di digitarectrl-b d
Andrew

306

Opzione 1: nohup

Il modo migliore è spesso il più semplice.

nohup long-running-command &

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

man nohup

Opzione 2: bg

Se vuoi "mettere in background" alcune attività già in esecuzione, allora la tua scommessa migliore è Ctrl+, Zquindi eseguire

bg

per mettere in background l'attività sospesa più recente, consentendole di continuare l'esecuzione.

Quindi una rapida disowndovrebbe mantenere il processo in esecuzione dopo la disconnessione.

screene altri possono farlo, ma non è quello a cui servono. Consiglio nohupper le attività che sai che lascerai indietro e bgper le attività già in esecuzione e che non desideri ricominciare.

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


4
Consiglierei di faredisown -h
Michele,

interessante lo schermo e tmux non funziona per minatore, bur nohup funziona
Yasin Okumuş

1
bg+ disownnon ha funzionato per me. Avevo in esecuzione uno script di distribuzione, mi ero dimenticato di iniziare all'interno di tmux e dovevo partire presto per un incontro. Lo script invia continuamente progressi alla shell. ctrl+zha interrotto il processo, riportandomi a bash. bgha ripreso il processo, ma ha anche ripreso a riportare lo stato a bash, rendendo impossibile vedere cosa stavo scrivendo. Tuttavia, un disowncomando ha prodotto "disown: current: no
like

questo non ha funzionato con me per nessun julia myFile.jlmotivo. tmux fa ed è fantastico.
Kilgoretrout,

Ha funzionato per me, grazie mille
Chad

207

Puoi farlo usando screen.

Digita man screenper saperne di più o leggi questa pagina man dello schermo .

Scenario semplice:

  • ssh nella tua casella remota. Digitare screenQuindi avviare il processo desiderato.

  • Premere Ctrl- Aquindi Ctrl- D. Questo "scollegherà" la sessione dello schermo ma lascerà i processi in esecuzione. È ora possibile disconnettersi dalla casella remota.

  • Se si desidera tornare più tardi, accedere nuovamente e digitare screen -rQuesto "riprenderà" la sessione dello schermo e sarà possibile visualizzare l'output del processo.


32
Di solito nominerò le mie sessioni dello schermo usando screen -S nameper rendere più semplice il collegamento a quella corretta in seguito.
David Oneill,

Il collegamento non è
attivo

1
Personalmente, sto lavorando a una scatola senza alcun software di controllo dei pacchetti. Dopo aver trascorso circa mezz'ora a costruire dipendenze per TMUX (di cui personalmente ho esperienza e simili) 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 dal tempo necessario per la configurazione. Grazie per questa risposta :)
Max von Hippel

La combinazione con screen -Sprima del congedo e screen -ral ritorno è incredibile!
Meloman,

Grazie per questo. Questa soluzione ha funzionato per me mentre tmux no (io uso una versione di bash per Windows mentre eseguo shsh in una macchina linux)
Michael Sorensen,

83

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, rimuovere ogni jobspec dalla tabella dei lavori attivi. Se -hviene fornita l' opzione, il lavoro non viene rimosso dalla tabella, ma viene contrassegnato in modo che SIGHUP non venga inviato al lavoro se la shell riceve un SIGHUP. Se jobspec non è presente e non viene fornita -ané l' -ropzione né l' opzione, viene utilizzato il lavoro corrente. Se non viene fornito jobspec , l' -aopzione significa rimuovere o contrassegnare tutti i lavori; l' -ropzione senza un argomento jobspec limita l'operazione ai lavori in esecuzione.

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


10
Questo è anche il mio modo preferito per farlo. Uso frequentementedisown -a && exit
Stefano Palazzo

1
Perfetto. Questo è un comando adorabile e merita tutti i voti!
Greg,

8
un avvertimento, ho interrotto un processo in esecuzione con Ctrl-Z e non l'ho avviato in background prima di chiamare disowne lo ha ucciso.
HDave,

3
Potrebbe bloccarsi se vuole scrivere sul terminale. Reindirizzare l'output di un processo in esecuzione non è così semplice. Meglio avviarlo correttamente senza nohup.
jiggunjer,

2
Questa è una buona risposta, perché risponde direttamente alla domanda. L'autore della domanda ha chiesto cosa fare dopo aver già eseguito un gruppo di comandi a esecuzione prolungata. La maggior parte di queste risposte ti consente di sapere cosa fare prima di eseguire i comandi.
q0rban,

53

Ero bloccato in un grande mv, quindi non ero in grado di interrompere il processo, impostare la schermata e riavviarlo. Sono riuscito a 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 [processo pid opzionale, impostazione predefinita per ultimo]
  6. Uscita

Il passaggio 3 mette in pausa il processo corrente (ad es. Il mio comando 'mv').
Il passaggio 4 mette il processo in pausa sullo sfondo e lo riprende.
Il passaggio 5 ti consente di rinnegare il processo. ** Per ottenere un elenco di lavori digitare semplicemente jobsprima.


** Per quanto riguarda il rinnegamento (dal manuale di bash):

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.

2
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 qualsiasi comando e che è in esecuzione a lungo. Terminare e avviarlo in una sessione TMUX richiederà tempo
Deepali Mittal

1
@ tom-brossman: fai attenzione alle modifiche non necessarie come questa ! Se richiamato senza la specifica del lavoro, il disowncomando integrato agisce sul lavoro in background più recente.
David Foerster,

22

Esistono due programmi principali che è possibile utilizzare per mantenere i programmi e lo stato del terminale su più connessioni ssh. Sono schermo (l'operatore storico, ma purtroppo non mantenuto. Apparentemente in fase di sviluppo attivo ora ) e tmux (più recente, attivamente mantenuto). Byobu è un front-end che può essere eseguito su uno di questi sistemi e offre ulteriori informazioni sullo stato di Ubuntu. Sulle nuove installazioni userà tmux come backend, se hai una vecchia installazione di byobu e una configurazione esistente manterrà il backend precedente, sia esso screen o tmux.

Byobu

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

sudo aptitude install byobu

Usando yum, lo fai

su -c 'yum install byobu'

È anche possibile installare byobu su altre distribuzioni.

Utilizzando byobu

Puoi avviare byobu eseguendolo byobusul computer host dopo esserti connesso usando ssh. Questo ti darà una shell simile a questa:

image-Byobu

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

Uso:

Inizia 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 è necessario uccidere effettivamente i processi in esecuzione nel terminale per uscire dal terminale. Puoi semplicemente inviare screen / tmux (lo scheletro di byobu) allo sfondo e riprendere la prossima volta che verrai:

  • Per uscire da Byobu e mantenerlo in funzione (staccare) premere F6.
  • La prossima volta che vieni, fallo byobue tornerai dove eri.

    byobu-detach-attach

Puoi anche creare varie sessioni byobu byobu -S session1e così via. E puoi connetterti a uno di loro quando torni.

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


Ho provato a utilizzare byobu da una sessione basata su PuTTY sulla mia casella Ubuntu, ma ho la ripetizione e lo scorrimento della riga di stato sul display. Sebbene si sia staccato correttamente premendo F6, non era una soluzione utilizzabile nella mia configurazione.
jfmessier,

1
@jfmessier È perché PuTTY non prende bene ncurses (praticamente utf-8). È possibile eliminare questo problema seguendo questo thread - stackoverflow.com/questions/10731099/…
Siddhartha

Questo e spettacolare! 1. mi dà un prompt colorato di bash che non riesco ad abilitare con bash come shell predefinita e 2. riesco a eseguire 2 robot contemporaneamente e ho ancora un altro terminale su cui lavorare! @SiddharthaRT ti meriti un voto positivo signore!
Dev

18

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

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

Lo schermo ha il vantaggio di poter staccare da una macchina e ricollegarla da un'altra, il che è utile se si desidera verificare i processi di lunga durata che vanno oltre la fine della giornata lavorativa.

C'è una guida introduttiva ragionevole per lo schermo qui.

byobu mette un'interfaccia facile da usare nella 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 alternare avanti e indietro e F6 per disconnettersi. Digitare exit per terminare effettivamente i terminali in modo permanente.


byobu usa tmux in questi giorni ..
scottl

12
"Non è possibile farlo una volta avviato il processo, è necessario aver impostato le cose prima di eseguire un lavoro a esecuzione prolungata." - no, puoi usarlo disownper raggiungere questo obiettivo. Vedi la risposta di @ bassgey
Rich

1
dopo aver faticato ad imparare lo schermo e il tmux .... byobu mi ha fatto venire le lacrime agli occhi
HDave,

disowne, se necessario Ctrl-z, solo bgper ottenerlo dal terminale attivo e in background. Poi, disown.
mimoralea,

8

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

Inoltre, se i tuoi unici interessi sono di avere il processo in esecuzione e non è necessario riprenderne il controllo, e assolutamente importante non eri a conoscenza 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 in background digitando Ctrl + Z seguito da bg% 1 (il numero dipende dal numero del lavoro, di solito è 1, ma puoi facilmente estrarre l'elenco usando il comando lavori)

Invoca infine il comando disown (seguito dal jobid ... lo stesso del comando bg)

Ciò rimuoverà la relazione genitore-figlio tra la shell e il processo in background, impedendo che muoia al termine della shell.


2
Questa risposta è la migliore! Perché tutti parlano screen, la domanda è stata posta evento post-login, come mantenere i processi in esecuzione, ora dopo aver effettuato l'accesso ma prima di avviarli. Ottima risposta Jorge, mi hai davvero aiutato! :)
jwbensley,

1
Semplicemente bg(senza %1) è spesso sufficiente, poiché il default è il lavoro corrente
Walter Tross,

Sarebbe bello avere una risposta esaustiva: A priori (installazione anticipata): schermo terminale ascii (vecchio), tmux (nuovo); X windows: vnc (vecchio, ancora mantenuto), xpra (più recente), con xpra senza root. Un posteriore (persistente dopo che hai iniziato): ^ Z, rinnega, ... Ma sono troppo pigro per approfondire più di questo.
Krazy Glew,

8

Per un singolo script di shell che ho in esecuzione per un lungo periodo di tempo, accederò ed eseguirò il processo in background usando '&'.

Esempio:

/path/to/my/script &

Ho disconnesso e disconnesso la mia sessione SSH. Quando accedo qualche tempo dopo, lo script è ancora in esecuzione, come dimostrato dalla continua raccolta di dati dallo script.


3
Sì, vorrei sapere come schermo / tmux è migliore di questa semplice soluzione.
Mads Skjern,

Sì, posso vederlo anche sul mio Ubuntu, ma in teoria non dovrebbe succedere. Non capisco perché
Daniel Pinyol,

1
@MadsSkjern Perché non è possibile immettere alcun input nello script utilizzando questo metodo.
Ken Sharp,

1
@MadsSkjern il motivo è che se si eseguono processi come questo &se ci si disconnette e si accede alla sessione SSH, il processo continuerà comunque a essere eseguito, ma non sarà possibile vedere l' output di quel processo (se lo script ha fatto eco a qualcosa non lo vedrà, ma se scrive un file il file sarà lì)
DarkCygnus

4

Dovresti dare un'occhiata alla schermata GNU e vedere se ti aiuta. A seconda di come è necessario 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 :

  • Utilizzare il comando screenper il primo avvio, scorrere i messaggi di introduzione, si dovrebbe consegnare un terminale.
  • Ca Cc apre un altro terminale
  • Ca Ck uccide un terminale
  • È possibile utilizzare Ca C-Space e Ca C-Backspace per scorrere i terminali
  • Ca Ca è utile se utilizzi principalmente solo due terminali
  • Ca Cd stacca la sessione corrente dello schermo ed esce dalle schermate. È quindi possibile utilizzare screen -rper riprendere quella sessione. Puoi avere più sessioni di schermo separate contemporaneamente, in questo caso ti verrà mostrato un elenco di sessioni disponibili.

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


3

Risposta più semplice ...

ctrl + z sospenderà il programma in esecuzione

"bg" lo eseguirà in background


5
Senza rinnegare il processo (con qualcosa di simile disowno nohup), questo di solito non manterrà il processo in esecuzione dopo la fine della sessione SSH.
Eliah Kagan,

3
Sul mio server Ubuntu, con la configurazione predefinita, continua davvero a funzionare!
Mads Skjern,

3

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

disown -a

0

Mentre tutti dicono di usare disown(l'unica opzione che hai dopo aver già avviato il processo), nohupo anche eseguendo il comando screen, il che è utile se vuoi vedere tutto l'output del comando ... Sono un fan di screen.. Ho ancora provato le più recenti distribuzioni mainstream di Linux e semplicemente mettere il lavoro in background e uscire non causa 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 fino a quando 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$ 

Mentre sono d'accordo che screensarebbe il modo migliore per eseguire questo, anche se il mio script ha scritto per registrare file o altro .. Non ho mai avuto bisogno di usare disown -a o a nohupmeno che non fosse fuori dalla paranoia completa. Forse qualcuno può far luce su come si comporta bash di default? Forse alcuni amministratori di sistema modificano le impostazioni predefinite su grandi shell per impedire ai processi dei loro utenti di sovraccaricare il sistema?


Se hai ulteriori domande, ti preghiamo di farle come una nuova domanda
heemayl

0

Sfortunatamente, una sessione SSH terminata può provocare la morte di tmux o dello schermo. Questo perché systemdterminerà tutti i processi figlio all'uscita da una sessione.

Puoi modificare questa impostazione nel tuo logind.conf( /etc/systemd/logind.conf):

KillUserProcesses=no

Grazie a rispondere in https://unix.stackexchange.com/questions/490267 .


-1

Invece di :

cmd options; 

Aggiungi prima nohup:

nohup cmd options & 

Quindi, sarai in grado di vedere la console stdout:

tail -f nohup.out
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.