Introduzione
In genere quando si esegue un comando nel terminale, è necessario attendere fino al termine del comando prima di poter immettere un altro. Questo significa eseguire il comando nel processo foreground o in primo piano (foreground). Quando un processo viene eseguito in primo piano, occupa la shell e puoi interagire con esso utilizzando i dispositivi di input.
Cosa succede se il comando impiega molto tempo per terminare e si desidera eseguire altri comandi nel frattempo? Hai diverse opzioni a tua disposizione. L'opzione più ovvia e semplice è quella di avviare una nuova sessione di shell ed eseguire il comando al suo interno. Un'altra opzione è eseguire il comando in background.
Un processo in background è un processo/comando che viene avviato da un terminale e viene eseguito in background, senza interazione da parte dell'utente.
In questo articolo, parleremo dei processi in background è Linux. Ti mostreremo come avviare un comando in background e come mantenere il processo in esecuzione dopo la chiusura della sessione della shell.
Eseguire un comando in background
Per eseguire un comando in background, aggiungi il simbolo e commerciale &
alla fine del comando:
command &
L'ID del lavoro della shell (racchiuso tra parentesi) e l'ID del processo verranno stampati sul terminale:
[1] 24166
Puoi avere più processi in esecuzione contemporaneamente in background.
Il processo in background continuerà a scrivere messaggi sul terminale da cui è stato richiamato il comando. Per sopprimere i messaggi stdout
e stderr
utilizzare la sintassi seguente:
command > /dev/null 2>&1 &
>/dev/null 2>&1
significa reindirizzamento stdout
verso /dev/null
e stderr
verso stdout
.
Utilizzare l'utility jobs
per visualizzare lo stato di tutti i processi arrestati e in background nella sessione di shell corrente:
jobs -l
L'output include il numero del processo, l'ID processo, lo stato del processo e il comando che ha avviato il processo:
[1]+ 24166 Running ping google.com &
Per portare in foreground un processo in background, utilizzare il comando fg
:
fg
Se si dispone di più lavori in background, includere %
e l'ID lavoro dopo il comando:
fg %1
Per terminare il processo in background, utilizzare il comando kill
seguito dall'ID del processo:
kill -9 24166
Spostare un processo da foreground a background
Per spostare un processo in primo piano (foreground) in esecuzione in background:
- Interrompere il processo digitando
Ctrl+Z
. - Spostare il processo interrotto in background digitando
bg
.
Mantenere in esecuzione i processi in background dopo l'uscita di una shell
Se la connessione si interrompe o ci si disconnette dalla sessione della shell, i processi in background vengono terminati. Esistono diversi modi per mantenere il processo in esecuzione al termine della sessione di shell interattiva.
Un modo è rimuovere il lavoro dal controllo dei lavori della shell usando il comando disown
integrato della shell:
disown
Se hai più di un lavoro in background, includi %
e l'ID dopo il comando:
disown %1
Verificare che il lavoro venga rimosso dalla tabella dei lavori attivi utilizzando il comando jobs -l
. Per elencare tutti i processi in esecuzione, incluso quello sconosciuto, utilizzare il comando ps aux
.
Un altro modo per mantenere in esecuzione un processo dopo l'uscita della shell è usare nohup
.
Il comando nohup
esegue un altro programma specificato come argomento e ignora tutti i segnali (hangup) SIGHUP
. SIGHUP
è un segnale che viene inviato a un processo quando il suo terminale di controllo è chiuso.
Per eseguire un comando in background utilizzando il comando nohup
, digitare:
nohup command &
L'output del comando viene reindirizzato al file nohup.out
.
nohup: ignoring input and appending output to 'nohup.out'
Se si disconnette o si chiude il terminale, il processo non viene terminato.
Alternative
Esistono numerosi programmi che ti consentono di avere più sessioni interattive contemporaneamente.
Screen
Screen o GNU Screen è un programma multiplexer terminale che consente di avviare una sessione dello schermo e aprire un numero qualsiasi di finestre (terminali virtuali) all'interno di quella sessione. I processi in esecuzione sullo schermo continueranno a essere eseguiti quando la loro finestra non è visibile anche se si viene disconnessi.
Tmux
Tmux è una moderna alternativa a GNU screen. Con Tmux, puoi anche creare una sessione e aprire più finestre all'interno di quella sessione. Le sessioni di Tmux sono persistenti, il che significa che i programmi in esecuzione in Tmux continuano a funzionare anche se si chiude il terminale.
Conclusione
Per eseguire un comando in background, includere &
alla fine del comando.
Quando si esegue un comando in background, non è necessario attendere fino al termine prima di poterne eseguire un altro.