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:

  1. Interrompere il processo digitando Ctrl+Z.
  2. 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.