Comando bg in Bash: riprendere un job sospeso in background

bg riprende in background un job sospeso della shell Bash corrente, lasciando disponibile il terminale. È utile dopo aver sospeso un comando in primo piano con Ctrl+Z, quando l’attività può continuare senza leggere dal terminale.

Il controllo dei job è la funzione con cui la shell gestisce sospensione e ripresa delle proprie attività. Bg invia il segnale di continuazione SIGCONT al job sospeso, senza portarlo in primo piano. Individua prima il job con jobs e i suoi numeri locali alla shell: una specifica come %1 non è un identificatore di processo (PID).

Sintassi di base

bg [%numero_job]

La guida riguarda il comando incorporato in Bash con il controllo dei job abilitato, normalmente in una sessione interattiva. Consulta help bg nella shell usata. Bash accetta anche più specifiche di job, ma gli esempi riprendono una sola attività già controllata.

Esempi pratici

Controllare i job sospesi

Per una prova semplice, esegui sleep 60 in una sessione Bash interattiva e premi Ctrl+Z mentre è ancora attivo. Con la normale configurazione del terminale, la combinazione sospende il job e restituisce il prompt. Non digitarla come testo nel comando. Nella stessa shell, controlla quindi i job sospesi:

jobs -s

Devi vedere una riga relativa al tuo sleep con stato Stopped. Se il comando è già terminato o non compare, ricomincia la prova; non scegliere un’altra attività soltanto perché ha il numero 1.

Riprendere un job specifico in background

Sostituisci %1 con il numero effettivamente mostrato per il tuo job. La specifica ha significato soltanto nella shell che lo gestisce.

bg %1

Verificare la ripresa

Controlla di nuovo stato, comando e PID. Finché lo sleep non termina, ci si aspetta Running. La shell rimane disponibile per altri comandi.

jobs -l

Dalla sospensione alla ripresa

La sequenza seguente riunisce consultazione e ripresa. Presuppone che tu abbia già avviato e sospeso lo sleep come descritto sopra; non crea un job. Verifica la prima riga prima di eseguire bg %1 e adatta il numero al risultato.

jobs
bg %1
jobs

Queste due righe illustrano lo stato prima e dopo la ripresa; non sono una trascrizione completa dell’output, perché bg può stampare anche il comando ripreso. Numero, spaziatura e marcatore possono variare.

[1]+  Stopped  sleep 60
[1]+  Running  sleep 60 &

[1] è il numero del job e + indica il job corrente per il controllo dei job. Running significa che non è sospeso: uno sleep continua ad attendere e non deve occupare costantemente la CPU. Una pipeline può contenere più processi nello stesso job.

Bg restituisce zero quando la ripresa richiesta riesce, ma quel valore non è l’esito finale del programma. Se il controllo dei job è disabilitato, la specifica non esiste o il job è stato avviato senza controllo dei job, l’operazione può fallire. Leggi il messaggio e verifica la tabella invece di sostituire arbitrariamente un PID al numero preceduto da %.

Quando un job termina e Bash ne notifica la conclusione, può scomparire dalla tabella. Se non compare più, non significa automaticamente che sia ancora sospeso o che bg abbia fallito.

Forme per scegliere il job

Forma Significato in Bash
%N Il job numero N della shell corrente.
%+ Il job corrente, marcato con + nell’elenco.
%- Il job precedente, marcato con - quando presente.
Nessun argomento Il job che Bash considera corrente.

Nella tabella N è un segnaposto numerico: per il job 2 useresti bg %2. Prima di usare bg senza argomenti, controlla quale attività abbia il marcatore +. “Corrente” non significa che sia già in primo piano; i marcatori cambiano quando avvii, sospendi o riprendi dei job.

Quando il job si ferma di nuovo

Su Linux, un processo in background che tenta di leggere dal terminale di controllo può ricevere SIGTTIN ed essere nuovamente sospeso. Il problema riguarda l’accesso al terminale: non ogni lettura dallo standard input provoca necessariamente una sospensione, per esempio se l’input proviene da un file. Se il programma richiede interazione, valuta di riportare il job in primo piano con fg %1, usando sempre il suo numero effettivo.

Sospendere con Ctrl+Z non equivale a terminare il programma: l’attività conserva il proprio stato. Dopo la prova puoi aspettare che sleep finisca oppure riportare il tuo sleep in primo piano e interromperlo con Ctrl+C. Verifica prima nome e numero del job; non applicare la procedura a un’attività estranea.

Bg non importa i processi di altri terminali nella tabella della shell e non garantisce che un job sopravviva alla chiusura della sessione. Negli script il controllo dei job è normalmente disattivato: non considerare questa sequenza interattiva un sostituto di una gestione esplicita dei processi asincroni.

La prova disponibile ha usato Git Bash 5.3.9 su Windows, con controllo dei job abilitato in una shell isolata: un solo sleep di prova è stato sospeso mediante un segnale diretto al suo PID e ripreso con bg. Sono stati verificati Stopped, Running e i filtri di jobs; il processo è stato poi terminato e raccolto con wait. Non sono stati provati la combinazione fisica Ctrl+Z né il comportamento SIGTTIN del terminale Linux.

Domande frequenti

Aggiungere & alla fine del comando equivale a usare bg?

Il simbolo & avvia un comando in background fin dall’inizio. Bg serve invece a riprendere in background un job sospeso già gestito dalla shell corrente. In entrambi i casi, se l’attività richiede il terminale, occorre considerare le regole del controllo dei job.

Documentazione di riferimento

Il manuale Bash del progetto, sezione Job Control Builtins descrive bg e i suoi esiti. La sezione Job Control Basics dello stesso manuale spiega sospensione, ripresa, specifiche dei job e accesso al terminale.