Come eseguire e controllare i processi in background su Linux

Usa la shell Bash in Linux per gestire i processi in primo piano e in background. È possibile utilizzare i segnali e le funzioni di controllo del lavoro di Bash per offrire maggiore flessibilità nell’esecuzione dei comandi. Ti mostriamo come.

Tutto sui processi

Ogni volta che un programma viene eseguito in un sistema operativo simile a Linux o Unix, viene avviato un processo. “Processo” è il nome per la rappresentazione interna del programma in esecuzione nella memoria del computer. C’è un processo per ogni programma attivo. In effetti, c’è un processo per quasi tutto ciò che è in esecuzione sul tuo computer. Ciò include i componenti del tuo file ambiente desktop grafico (GDE) come GNOME o KDEe sistema demoni che vengono lanciati all’avvio.

Perché quasi tutto ciò che è in esecuzione? Bene, i built-in di Bash come CD, pwd, e alias non è necessario che un processo venga avviato (o “generato”) quando vengono eseguiti. Bash esegue questi comandi all’interno dell’istanza della shell Bash in esecuzione nella finestra del terminale. Questi comandi sono veloci proprio perché non hanno bisogno di avere un processo avviato per essere eseguiti. (Puoi digitare help in una finestra del terminale per vedere l’elenco dei built-in di Bash.)

I processi possono essere in esecuzione in primo piano, nel qual caso assumono il controllo del terminale fino al completamento, oppure possono essere eseguiti in background. I processi che vengono eseguiti in background non dominano la finestra del terminale e puoi continuare a lavorarci. O almeno, non dominano la finestra del terminale se non generano l’output dello schermo.

Un esempio disordinato

Inizieremo un semplice ping traccia in esecuzione. Eseguiremo il ping del dominio winadmin.it. Questo verrà eseguito come un processo in primo piano.

ping www.howtogeek.com

Otteniamo i risultati attesi, scorrendo la finestra del terminale. Non possiamo fare nient’altro nella finestra del terminale mentre il ping è in esecuzione. Per terminare il comando premi Ctrl + C.

Ctrl+C

ping dell'output della traccia in una finestra di terminale

L’effetto visibile di Ctrl + C è evidenziato nello screenshot. ping fornisce un breve riepilogo e poi si ferma.

Ripetiamolo. Ma questa volta premeremo Ctrl + Z invece di Ctrl + C. L’attività non verrà terminata. Diventerà un’attività in background. Otteniamo il controllo della finestra del terminale che ci viene restituita.

ping www.howtogeek.com
Ctrl+Z

effetto di Ctrl + Z su un comando in esecuzione in una finestra di terminale

L’effetto visibile di premere Ctrl + Z è evidenziato nello screenshot.

Questa volta ci viene detto che il processo è stato interrotto. Fermato non significa terminato. È come un’auto a un segnale di stop. Non l’abbiamo scartato e buttato via. È ancora sulla strada, fermo, in attesa di partire. Il processo è ora un lavoro in background.

Il comando jobs elencherà i lavori che sono stati avviati nella sessione del terminale corrente. E poiché i lavori sono (inevitabilmente) processi, possiamo anche utilizzare il comando ps per visualizzarli. Usiamo entrambi i comandi e confrontiamo i loro output. Useremo l’opzione T (terminale) per elencare solo i processi in esecuzione in questa finestra di terminale. Nota che non è necessario utilizzare un trattino – con l’opzione T.

jobs
ps T

comando jobs in una finestra di terminale

Il comando jobs ci dice:

[1]: Il numero tra parentesi quadre è il numero del lavoro. Possiamo usarlo per fare riferimento al lavoro quando dobbiamo controllarlo con i comandi di controllo del lavoro.
+: Il segno più + mostra che questo è il lavoro su cui si agirà se utilizziamo un comando di controllo lavoro senza un numero di lavoro specifico. Si chiama lavoro predefinito. Il lavoro predefinito è sempre quello aggiunto più di recente all’elenco dei lavori.
Interrotto: il processo non è in esecuzione.
ping www.howtogeek.com: la riga di comando che ha avviato il processo.

Il comando ps ci dice:

PID: l’ID del processo. Ogni processo ha un ID univoco.
TTY: lo pseudo-telescrivente (finestra del terminale) da cui è stato eseguito il processo.
STAT: lo stato del processo.
TIME: la quantità di tempo della CPU impiegata dal processo.
COMANDO: il comando che ha avviato il processo.

Questi sono valori comuni per la colonna STAT:

D: Sonno ininterrotto. Il processo è in uno stato di attesa, solitamente in attesa di input o output e non può essere interrotto.
I: inattivo.
R: Correre.
S: sonno interrompibile.
T: Arrestato da un segnale di controllo lavoro.
Z: Un processo zombie. Il processo è stato terminato ma non è stato “ripulito” dal processo genitore.

Il valore nella colonna STAT può essere seguito da uno di questi indicatori aggiuntivi:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Possiamo vedere che Bash ha uno stato di Ss. La “S” maiuscola ci dice che la shell Bash è inattiva ed è interrompibile. Non appena ne avremo bisogno, risponderà. La “s” minuscola ci dice che la shell è un leader di sessione.

Il comando ping ha uno stato di T. Questo ci dice che il ping è stato interrotto da un segnale di controllo del lavoro. In questo esempio, quello era il Ctrl + Z che abbiamo usato per metterlo in background.

Il comando ps T ha uno stato di R, che sta per running. Il + indica che questo processo è un membro del gruppo in primo piano. Quindi il comando ps T è in esecuzione in primo piano.

Il comando bg

Il comando bg viene utilizzato per riprendere un processo in background. Può essere utilizzato con o senza un numero di lavoro. Se lo si utilizza senza un numero di lavoro, il lavoro predefinito viene portato in primo piano. Il processo viene ancora eseguito in background. Non è possibile inviare alcun input ad esso.

Se emettiamo il comando bg, riprenderemo il nostro comando ping:

bg

bg in una finestra di terminale

Il comando ping riprende e vediamo di nuovo l’output a scorrimento nella finestra del terminale. Viene visualizzato il nome del comando che è stato riavviato. Questo è evidenziato nello screenshot.

ripreso il processo di ping in background con output in una vedova terminale

Ma abbiamo un problema. L’attività è in esecuzione in background e non accetta input. Allora come lo fermiamo? Ctrl + C non fa nulla. Possiamo vederlo quando lo digitiamo, ma l’attività in background non riceve quelle sequenze di tasti, quindi continua a eseguire il ping allegramente.

Attività in background ignorando Ctrl + C in una finestra di terminale

In effetti, ora siamo in una strana modalità mista. Possiamo digitare nella finestra del terminale, ma ciò che digitiamo viene rapidamente spazzato via dallo scorrimento dell’output del comando ping. Tutto ciò che digitiamo ha effetto in primo piano.

Per interrompere la nostra attività in background, dobbiamo portarla in primo piano e quindi interromperla.

Il comando fg

Il comando fg porterà un’attività in background in primo piano. Proprio come il comando bg, può essere utilizzato con o senza un numero di lavoro. Usarlo con un numero di lavoro significa che opererà su un lavoro specifico. Se viene utilizzato senza un numero di lavoro, viene utilizzato l’ultimo comando inviato in background.

Se digitiamo fg, il nostro comando ping verrà portato in primo piano. I caratteri che digitiamo vengono confusi con l’output del comando ping, ma vengono gestiti dalla shell come se fossero stati inseriti dalla riga di comando come al solito. E infatti, dal punto di vista della shell Bash, è esattamente quello che è successo.

fg

comando fg mescolato con l'output da ping in una finestra di terminale

E ora che abbiamo il comando ping in esecuzione ancora una volta in primo piano, possiamo usare Ctrl + C per ucciderlo.

Ctrl+C

Ctrl + C interrompe il comando ping in una finestra di terminale

Dobbiamo inviare i segnali giusti

Non era esattamente carino. Evidentemente l’esecuzione di un processo in background funziona meglio quando il processo non produce output e non richiede input.

Ma, disordinato o no, il nostro esempio ha ottenuto:

Mettere un processo in secondo piano.
Ripristino del processo in uno stato in esecuzione in background.
Riportando il processo in primo piano.
Terminare il processo.

Quando usi Ctrl + C e Ctrl + Z, invii segnali al processo. Questi sono modi stenografici di usare il comando kill. Ci sono 64 segnali diversi quell’uccisione può inviare. Usa kill -l nella riga di comando per elencarli. kill non è l’unica fonte di questi segnali. Alcuni di essi vengono generati automaticamente da altri processi all’interno del sistema

Ecco alcuni di quelli comunemente usati.

SIGHUP: Segnale 1. Inviato automaticamente a un processo quando il terminale in cui è in esecuzione è chiuso.
SIGINT: Signal 2. Inviato a un processo premi Ctrl + C. Il processo viene interrotto e viene detto di terminare.
SIGQUIT: Segnale 3. Inviato a un processo se l’utente invia un segnale di chiusura Ctrl + D.
SIGKILL: Segnale 9. Il processo viene immediatamente interrotto e non tenterà di chiudersi in modo pulito. Il processo non si svolge con grazia.
SIGTERM: Signal 15. Questo è il segnale predefinito inviato da kill. È il segnale di fine programma standard.
SIGTSTP: Signal 20. Inviato a un processo quando usi Ctrl + Z. Arresta il processo e lo mette in background.

Dobbiamo utilizzare il comando kill per emettere segnali a cui non sono assegnate combinazioni di tasti.

Ulteriore controllo del lavoro

Un processo spostato in background utilizzando Ctrl + Z viene posto in stato di arresto. Dobbiamo usare il comando bg per riavviarlo. Avviare un programma come un processo in background in esecuzione è semplice. Aggiungi una e commerciale & alla fine della riga di comando.

Sebbene sia meglio che i processi in background non scrivano nella finestra del terminale, useremo esempi che lo fanno. Dobbiamo avere qualcosa negli screenshot a cui possiamo fare riferimento. Questo comando avvierà un ciclo infinito come processo in background:

mentre vero; fare eco “winadmin.it Loop Process”; dormire 3; fatto &

mentre vero;  fai eco

Ci viene comunicato il numero del lavoro e l’ID del processo ID del processo. Il nostro numero di lavoro è 1 e l’ID del processo è 1979. Possiamo utilizzare questi identificatori per controllare il processo.

L’output del nostro ciclo infinito inizia ad apparire nella finestra del terminale. Come prima, possiamo usare la riga di comando ma tutti i comandi che emettiamo sono intervallati dall’output del processo del ciclo.

ls

output del processo di loop in background intervallato da output di altri comandi

Per interrompere il nostro processo, possiamo utilizzare i lavori per ricordare a noi stessi qual è il numero del lavoro, quindi utilizzare kill.

jobs segnala che il nostro processo è il lavoro numero 1. Per usare quel numero con kill dobbiamo farlo precedere da un segno di percentuale%.

jobs
kill %1

lavori e uccidi% 1 in una finestra di terminale

kill invia il segnale SIGTERM, il segnale numero 15, al processo e viene terminato. Alla successiva pressione del tasto Invio, viene visualizzato uno stato del lavoro. Elenca il processo come “terminato”. Se il processo non risponde al comando kill, puoi aumentarlo di una tacca. Usa kill con SIGKILL, segnale numero 9. Metti semplicemente il numero 9 tra il comando kill e il numero di lavoro.

kill 9 %1

Cose che abbiamo trattato

Ctrl + C: invia SIGINT, segnale 2, al processo, se accetta input, e gli dice di terminare.
Ctrl + D: invia SISQUIT, segnale 3, al processo, se accetta input, e gli dice di uscire.
Ctrl + Z: invia SIGSTP, segnale 20, al processo e gli dice di fermarsi (sospendere) e diventare un processo in background.
lavori: elenca i lavori in background e mostra il loro numero di lavoro.
bg job_number: riavvia un processo in background. Se non si fornisce un numero di lavoro, viene utilizzato l’ultimo processo che è stato trasformato in un’attività in background.
fg job_number: porta un processo in background in primo piano e lo riavvia. Se non si fornisce un numero di lavoro, viene utilizzato l’ultimo processo che è stato trasformato in un’attività in background.
riga di comando &: l’aggiunta di una e commerciale & alla fine di una riga di comando esegue il comando come attività in background, ovvero in esecuzione.
kill% job_number: invia SIGTERM, segnale 15, al processo per terminarlo.
kill 9% job_number: invia SIGKILL, segnale 9, al processo e lo termina bruscamente.