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 screen
per molte ragioni, ecco alcuni esempi:
Per ottenere la stessa funzionalità descritta nella raccomandazione di rispostascreen
, è necessario effettuare le seguenti operazioni:
tmux
digitando tmux
nella shelltmux
sessione avviatatmux
sessione 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 attach
per collegarti alla tmux
sessione.
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
.
tmux
può fare cose molto più avanzate rispetto a gestire una singola finestra in una singola sessione. Per maggiori informazioni date un'occhiata in man tmux
o la pagina di GitHub tmux . In particolare, ecco una FAQ sulle principali differenze tra screen
e tmux
.
screen -x -r [screenname]
o screen -rx
in breve se è attiva solo una sessione dello schermo. Ciò consente di allegare un'istanza di schermo esistente.
Ctrl-b
e quindi d
per uscire / staccare la tmux
sessione. Certamente questo è il caso della versione di tmux
Ubuntu 12.04.
tmux detach
invece di digitarectrl-b d
nohup
Il modo migliore è spesso il più semplice.
nohup long-running-command &
È stato creato appositamente per questo, registra persino stdout nohup.log
.
man nohup
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 disown
dovrebbe mantenere il processo in esecuzione dopo la disconnessione.
screen
e altri possono farlo, ma non è quello a cui servono. Consiglio nohup
per le attività che sai che lascerai indietro e bg
per 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
+ disown
non 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+z
ha interrotto il processo, riportandomi a bash. bg
ha ripreso il processo, ma ha anche ripreso a riportare lo stato a bash, rendendo impossibile vedere cosa stavo scrivendo. Tuttavia, un disown
comando ha prodotto "disown: current: no
julia myFile.jl
motivo. tmux fa ed è fantastico.
Puoi farlo usando screen
.
Digita man screen
per saperne di più o leggi questa pagina man dello schermo .
Scenario semplice:
ssh nella tua casella remota. Digitare screen
Quindi 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 -r
Questo "riprenderà" la sessione dello schermo e sarà possibile visualizzare l'output del processo.
screen -S name
per rendere più semplice il collegamento a quella corretta in seguito.
screen -S
prima del congedo e screen -r
al 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
-h
viene 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-a
né l'-r
opzione né l' opzione, viene utilizzato il lavoro corrente. Se non viene fornito jobspec , l'-a
opzione significa rimuovere o contrassegnare tutti i lavori; l'-r
opzione 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
disown
e 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 jobs
prima.
** 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.
disown
comando 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 byobu
sul 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 byobu
e tornerai dove eri.
Puoi anche creare varie sessioni byobu byobu -S session1
e 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.
disown
per raggiungere questo obiettivo. Vedi la risposta di @ bassgey
disown
e, se necessario Ctrl-z
, solo bg
per 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 :
screen
per il primo avvio, scorrere i messaggi di introduzione, si dovrebbe consegnare un terminale.screen -r
per 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
disown
o 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), nohup
o 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 screen
sarebbe 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 nohup
meno 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é systemd
terminerà 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