Diciamo che lancio una serie di processi da una sessione ssh. È possibile terminare la sessione ssh mantenendo in esecuzione quei processi sul computer remoto?
Diciamo che lancio una serie di processi da una sessione ssh. È possibile terminare la sessione ssh mantenendo in esecuzione quei processi sul computer remoto?
Risposte:
Dovresti cercare alternative moderne come tmux.
tmuxè superiore a screenper molte ragioni, ecco alcuni esempi:
Per ottenere la stessa funzionalità descritta nella raccomandazione di rispostascreen , è necessario effettuare le seguenti operazioni:
tmuxdigitando tmuxnella shelltmuxsessione avviatatmuxsessione 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.
screen -x -r [screenname]o screen -rxin breve se è attiva solo una sessione dello schermo. Ciò consente di allegare un'istanza di schermo esistente.
Ctrl-be quindi dper uscire / staccare la tmuxsessione. Certamente questo è il caso della versione di tmuxUbuntu 12.04.
tmux detachinvece di digitarectrl-b d
nohupIl modo migliore è spesso il più semplice.
nohup long-running-command &
È stato creato appositamente per questo, registra persino stdout nohup.log.
man nohup
bgSe 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.
disown -h
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
julia myFile.jlmotivo. tmux fa ed è fantastico.
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.
screen -S nameper rendere più semplice il collegamento a quella corretta in seguito.
screen -Sprima del congedo e screen -ral ritorno è incredibile!
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.
disown -a && exit
disowne lo ha ucciso.
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:
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.
disowncomando integrato agisce sul lavoro in background più recente.
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 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.
Puoi avviare byobu eseguendolo byobusul computer host dopo esserti connesso usando ssh. Questo ti darà una shell simile a questa:

Puoi anche usare Byobu Terminal su una macchina Ubuntu con l'opzione -X e avere un byobu perfettamente funzionante.
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:
La prossima volta che vieni, fallo byobue tornerai dove eri.

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 .
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.
disownper raggiungere questo obiettivo. Vedi la risposta di @ bassgey
disowne, se necessario Ctrl-z, solo bgper ottenerlo dal terminale attivo e in background. Poi, disown.
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.
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! :)
bg(senza %1) è spesso sufficiente, poiché il default è il lavoro corrente
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.
&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ì)
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 :
screenper il primo avvio, scorrere i messaggi di introduzione, si dovrebbe consegnare un terminale.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.
Risposta più semplice ...
ctrl + z sospenderà il programma in esecuzione
"bg" lo eseguirà in background
disowno nohup), questo di solito non manterrà il processo in esecuzione dopo la fine della sessione SSH.
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?
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 .
Invece di :
cmd options;
Aggiungi prima nohup:
nohup cmd options &
Quindi, sarai in grado di vedere la console stdout:
tail -f nohup.out