- Dave McKay
@TheGurkha
- 24 settembre 2019, 8:00 am EDT
Usare la Bash shell in Linux per la gestione di primo piano e di processi in background. È possibile utilizzare le funzioni e i segnali di controllo del lavoro di Bash per offrire maggiore flessibilità nel modo in cui si eseguono i comandi. Vi mostriamo come.
Tutto sui processi
Ogni volta che un programma viene eseguito in un sistema operativo Linux o Unix-like, 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 realtà, c’è un processo per quasi tutto ciò che è in esecuzione sul computer. Ciò include i componenti del tuo ambiente desktop grafico (GDE) come GNOME o KDE e i demoni di sistema che vengono lanciati all’avvio.
Perché quasi tutto ciò che è in esecuzione? Bene, i built-in Bash come cd, pwd e alias non hanno bisogno di avviare un processo (o “spawned”) 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 loro di eseguire. (È possibile digitare help
in una finestra di terminale per visualizzare l’elenco dei built-in Bash.)
I processi possono essere in esecuzione in primo piano, nel qual caso prendono il controllo del terminale fino a quando non sono stati completati, oppure possono essere eseguiti in background., I processi 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 una semplice tracciaping
in esecuzione. Stiamo andando a ping
il dominio How-To Geek. Questo verrà eseguito come un processo in primo piano.
ping www.howtogeek.com
Otteniamo i risultati attesi, scorrendo verso il basso la finestra del terminale. Non possiamo fare nient’altro nella finestra del terminale mentre ping
è in esecuzione., Per terminare il comando premere Ctrl+C
.
Ctrl+C
L’effetto visibile diCtrl+C
è evidenziato nello screenshot. ping
fornisce un breve riepilogo e quindi si interrompe.
Ripetiamolo. Ma questa volta colpiremo Ctrl+Z
invece di Ctrl+C
. L’attività non verrà terminata. Diventerà un compito in background. Otteniamo il controllo della finestra del terminale restituito a noi.,
ping www.howtogeek.com
Ctrl+Z
L’effetto visibile di colpireCtrl+Z
è evidenziato nello screenshot.
Questa volta ci viene detto che il processo è stato interrotto. Fermato non significa terminato. E ‘ come una macchina allo stop. Non l’abbiamo scartata e buttata via. È ancora sulla strada, fermo, in attesa di andare. Il processo è ora un lavoro in background.
Il comando jobs
elenca i lavori avviati nella sessione terminale corrente., E poiché i lavori sono (inevitabilmente) processi, possiamo anche usare il comandops
per vederli. Usiamo entrambi i comandi e confrontiamo i loro output. Useremo l’opzioneT
opzione (terminale) per elencare solo i processi in esecuzione in questa finestra di terminale. Si noti che non è necessario utilizzare un trattino -
con l’opzione T
.
jobs
ps T
Il comandojobs
ci dice:
- : Il numero tra parentesi quadre è il numero del lavoro., Possiamo usare questo per fare riferimento al lavoro quando abbiamo bisogno di controllarlo con i comandi di controllo del lavoro.
- +: Il segno più
+
mostra che questo è il lavoro su cui si agirà se si utilizza un comando di controllo del lavoro senza un numero di lavoro specifico. Si chiama il lavoro predefinito. Il lavoro predefinito è sempre quello aggiunto più di recente all’elenco dei lavori. - Fermato: il processo non è in esecuzione.
- ping www.howtogeek.com: La riga di comando che ha avviato il processo.,
Il comandops
ci dice:
- PID: L’ID del processo. Ogni processo ha un ID univoco.
- TTY: Lo pseudo-teletype (finestra terminale) da cui è stato eseguito il processo.
- STAT: Lo stato del processo.
- TEMPO: la quantità di tempo della CPU consumata dal processo.
- COMANDO: Il comando che ha avviato il processo.
Questi sono valori comuni per la colonna STAT:
- D: Uninterruptible sleep. Il processo è in uno stato di attesa, in genere in attesa di input o output e non può essere interrotto.,
- I: inattivo.
- R: In esecuzione.
- S: Sonno interrompibile.
- T: Fermato da un segnale di controllo del lavoro.
- Z: Un processo zombie. Il processo è stato terminato ma non è stato “ripulito” dal suo processo padre.
Il valore nella colonna STAT può essere seguito da uno di questi indicatori aggiuntivi:
- <: attività ad alta priorità (non piacevole per altri processi).
- N: Bassa priorità (piacevole per altri processi).
- L: il processo ha pagine bloccate in memoria (in genere utilizzate dai processi in tempo reale).,
- s: Un leader di sessione. Un leader di sessione è un processo che ha avviato gruppi di processi. Una shell è un leader di sessione.
- l: processo multi-thread.
- +: Un processo in primo piano.
Possiamo vedere che Bash ha uno stato diSs
. La ” S ” maiuscola ci dice che la shell Bash sta dormendo 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 diT
., Questo ci dice cheping
è stato fermato da un segnale di controllo del lavoro. In questo esempio, quello era il Ctrl+Z
lo mettevamo in secondo piano.
Il comando ps T
ha uno stato di R
, che sta per running. +
indica che questo processo è un membro del gruppo in primo piano. Quindi il comandops T
è in esecuzione in primo piano.
Il comando bg
Ilbg
comando 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 si problema il bg
comando, riprenderemo la nostra ping
comando:
bg
ping
comando riprende e vediamo lo scorrimento di output nella finestra del terminale, una volta di più. Viene visualizzato il nome del comando che è stato riavviato., Questo è evidenziato nello screenshot.
Ma abbiamo un problema. L’attività è in esecuzione in background e non accetta input. Quindi come lo fermiamo? Ctrl+C
non fa nulla. Possiamo vederlo quando lo digitiamo, ma l’attività in background non riceve quelle sequenze di tasti in modo da mantenere il ping allegramente lontano.
In realtà, ora siamo in una strana modalità blended. Possiamo digitare nella finestra del terminale ma ciò che digitiamo viene rapidamente spazzato via dall’output di scorrimento dal comando ping
. Tutto ciò che scriviamo ha effetto nel precedente.,
Per interrompere il nostro compito in background dobbiamo portarlo in primo piano e quindi fermarlo.
Il comando fg
Il comando fg
porterà un’attività in background in primo piano. Proprio come il comandobg
, 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 allo sfondo.
Se digitiamo fg
il nostro comando ping
verrà portato in primo piano., I caratteri che digitiamo sono mescolati con l’output del comando ping
, ma sono gestiti dalla shell come se fossero stati inseriti sulla riga di comando come al solito. E infatti, dal punto di vista di Bash shell, è esattamente quello che è successo.
fg
E ora che abbiamo il comando ping
in esecuzione in primo piano ancora una volta, possiamo usare Ctrl+C
per ucciderlo.
Ctrl+C
Abbiamo bisogno di inviare i segnali giusti
Che 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 realizzato:
- Mettendo un processo in background.
- Ripristino del processo a uno stato in esecuzione in background.
- Ritorno del processo in primo piano.
- Che termina il processo.
Quando si utilizzanoCtrl+C
eCtrl+Z
, si inviano segnali al processo. Questi sono modi abbreviati di utilizzare il comandokill
., Ci sono 64 diversi segnali chekill
può inviare. Utilizzare kill -l
alla 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: Segnale 2. Inviato a un processo si preme
Ctrl+C
. Il processo viene interrotto e detto di terminare., - SIGQUIT: Segnale 3. Inviato a un processo se l’utente invia un segnale di uscita
Ctrl+D
. - SIGKILL: Segnale 9. Il processo viene immediatamente ucciso e non tenterà di chiudere in modo pulito. Il processo non va giù con grazia.
- SIGTERM: Segnale 15. Questo è il segnale predefinito inviato da
kill
. È il segnale di terminazione del programma standard. - SIGTSTP: Segnale 20. Inviato a un processo quando si utilizza
Ctrl+Z
. Si ferma il processo e lo mette in background.,
Dobbiamo usare il comandokill
per emettere segnali a cui non sono assegnate combinazioni di tasti.
Ulteriore controllo del lavoro
Un processo spostato in background utilizzandoCtrl+Z
viene inserito nello stato di arresto. Dobbiamo usare il comandobg
per avviarlo di nuovo. Per avviare un programma come un processo in background in esecuzione è semplice. Aggiungere una e commerciale&
alla fine della riga di comando.,
Anche se è meglio che i processi in background non scrivono nella finestra del terminale, stiamo andando a utilizzare esempi che fanno. Abbiamo bisogno di avere qualcosa negli screenshot a cui possiamo fare riferimento. Questo comando avvierà un ciclo infinito come processo in background:
while true; do echo “How-To Geek Loop Process”; sleep 3; done&
Ci viene detto il numero di lavoro e l’ID ID del processo. Il nostro numero di lavoro è 1 e l’ID del processo è 1979. Possiamo usare 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 loop.
ls
Per interrompere il nostro processo possiamo usare jobs
per ricordare a noi stessi quale sia il numero del lavoro, e quindi usare kill
.
jobs
segnala che il nostro processo è il numero di lavoro 1. Per usare quel numero con kill
dobbiamo precederlo con un segno di percentuale%
.,
jobs
kill %1
kill
invia il segnale SIGTERM
, il segnale numero 15, al processo e viene terminato. Quando viene premuto il tasto Invio, viene visualizzato lo stato del lavoro. Elenca il processo come ” terminato.”Se il processo non risponde al comandokill
si può prendere su una tacca. Utilizzare kill
con SIGKILL
, numero di segnale 9. Basta inserire il numero 9 tra il comandokill
il numero del lavoro.,
kill 9 %1
Cose che abbiamo coperto
- Ctrl+C: Invia
SIGINT
, signal 2, al processo—se accetta l’input—e gli dice di terminare. - Ctrl + D: Invia
SISQUIT
, segnale 3, al processo—se sta accettando l’input-e gli dice di uscire. - Ctrl + Z: Invia
SIGSTP
, signal 20, al processo e gli dice di fermarsi (sospendere) e diventare un processo in background. - jobs: 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 quel comando come un’attività in background, che è in esecuzione. - kill % job_number: Invia
SIGTERM
, segnale 15, al processo per terminarlo., - kill 9% job_number: Invia
SIGKILL
, signal 9, al processo e lo termina bruscamente.
RELATED: Come uccidere i processi dal terminale Linux
Dave McKay ha usato per la prima volta i computer quando il nastro di carta punzonato era in voga, e da allora ha programmato. Dopo oltre 30 anni nel settore IT, ora è un giornalista tecnologico a tempo pieno., Durante la sua carriera, ha lavorato come programmatore freelance, manager di un team internazionale di sviluppo software, project manager di servizi IT e, più recentemente, come responsabile della protezione dei dati. Dave è un evangelista di Linux e fautore dell’open source.Leggi la Biografia completa ”