Soluzione 1:
Il metodo migliore è avviare il processo in un multiplexer terminale. In alternativa puoi fare in modo che il processo non riceva il segnale HUP.
Un multiplexer di terminale fornisce terminali "virtuali" che funzionano indipendentemente dal terminale "reale" (in realtà tutti i terminali oggi sono "virtuali" ma questo è un altro argomento per un altro giorno). Il terminale virtuale continuerà a funzionare anche se il tuo terminale reale viene chiuso con la tua sessione ssh.
Tutti i processi avviati dal terminale virtuale continueranno a essere eseguiti con quel terminale virtuale. Quando ti riconnetti al server puoi riconnetterti al terminale virtuale e tutto sarà come se nulla fosse accaduto, a parte il tempo trascorso.
Due popolari multiplexer di terminale sono screen e tmux.
Lo schermo ha una curva di apprendimento ripida. Ecco un buon tutorial con diagrammi che spiegano il concetto:http://www.ibm.com/developerworks/aix/library/au-gnu_screen/
Il segnale HUP (o SIGHUP) viene inviato dal terminale a tutti i suoi processi figli quando il terminale è chiuso. L'azione comune dopo aver ricevuto SIGHUP è terminare. Pertanto, quando la tua sessione ssh viene disconnessa, tutti i tuoi processi termineranno. Per evitare ciò puoi fare in modo che i tuoi processi non ricevano SIGHUP.
Due semplici metodi per farlo sono nohup
e disown
.
Per ulteriori informazioni su come nohup
e disown
lavora leggi questa domanda e rispondi:https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
Nota:anche se i processi continueranno a funzionare, non potrai più interagire con essi perché non sono più collegati a nessun terminale. Questo metodo è utile principalmente per processi batch di lunga durata che, una volta avviati, non richiedono più alcun input da parte dell'utente.
Soluzione 2:
Ci sono alcuni modi per farlo, ma quello che trovo più utile è usare GNU Screen.
Dopo aver effettuato l'accesso tramite ssh, esegui screen
. Questo avvierà un'altra shell in esecuzione all'interno dello schermo. Esegui il tuo comando, quindi fai un Ctrl -a d .
Questo ti "disconnetterà" dalla sessione dello schermo. A questo punto, puoi disconnetterti o fare qualsiasi altra cosa desideri.
Quando vuoi riconnetterti alla sessione dello schermo, esegui semplicemente screen -RD
dal prompt della shell (come lo stesso utente che ha creato la sessione).
Soluzione 3:
Nel bash
, il disown
parola chiave è perfettamente adatta a questo. Per prima cosa, esegui il tuo processo in background (usa &
o ^Z
quindi digita bg
):
$ wget --quiet http://server/some_big_file.zip &
[1] 1156
Digitando jobs
puoi vedere che il processo è ancora di proprietà della shell:
$ jobs
[1]+ Running wget
Se dovessi disconnetterti a questo punto, anche l'attività in background verrebbe interrotta. Tuttavia, se esegui disown
, bash scollega il lavoro e ne consente la continuazione:
$ disown
Puoi confermare questo:
$ jobs
$ logout
Puoi anche combinare il &
e disown
sulla stessa riga, come:
$ wget --quiet http://server/some_big_file.zip & disown
$ logout
È meglio che eseguire nohup
secondo me perché non lascia nohup.out
file disseminati in tutto il tuo filesystem. Inoltre, nohup
deve essere eseguito prima di eseguire il comando — disown
può essere utilizzato se decidi solo in seguito di voler mettere in secondo piano e staccare l'attività.
Soluzione 4:
Lo strumento nohup, disponibile sulla maggior parte delle macchine Linux, farà questo.
Soluzione 5:
Giusto per essere esaustivi, indicherò tmux, che ha la stessa idea di base di screen:
tmux vuole essere una moderna alternativa con licenza BSD a programmi come GNU screen. Le caratteristiche principali includono:
- Un'interfaccia di comando potente, coerente, ben documentata e facilmente gestibile tramite script.
- Una finestra può essere suddivisa orizzontalmente e verticalmente in riquadri.
- I riquadri possono essere spostati e ridimensionati liberamente o disposti in layout preimpostati.
- Supporto per terminali UTF-8 e 256 colori.
- Copia e incolla con più buffer.
- Menu interattivi per selezionare finestre, sessioni o client.
- Cambia la finestra corrente cercando il testo nella destinazione.
- Blocco del terminale, manualmente o dopo un timeout.
- Una base di codice pulita, facilmente estendibile, con licenza BSD, in fase di sviluppo attivo.
È, tuttavia, approssimativamente infinitamente più facile da cercare su Google.