Come eseguire e controllare i processi in background in Linux

Contenuti

Un ambiente shell su un computer Linux.

Usa la shell Bash su Linux per gestire i processi in primo piano e in background. Puoi utilizzare i segnali e le funzioni di controllo del lavoro di Bash per darti maggiore flessibilità nel modo in cui esegui i comandi. Ti mostriamo come.

Tutto sui processi

Ogni volta che un programma viene eseguito su un sistema operativo simile a Linux o Unix, viene avviata una procedura. "Procedura" è il nome della rappresentazione interna del programma in esecuzione nella memoria del computer.. Esiste una procedura per ogni programma attivo. In realtà, esiste una procedura per quasi tutto ciò che viene eseguito sul tuo computer. Ciò include i componenti del tuo ambiente desktop grafico (DOVE) Che cosa GNOMO oh DOVEe sistema dannazione che vengono lanciati all'inizio.

Come mai stretto tutto sta funzionando? Bene, Bash incorporato come cd, pwd, e alias non è necessario avviare una procedura (oh “generato”) quando corrono. Bash esegue questi comandi all'interno dell'istanza della shell Bash che viene eseguita nella finestra del terminale. Questi comandi sono veloci proprio perché non hanno bisogno di avere una procedura avviata per poter essere eseguiti.. (Puoi digitare help in una finestra di terminale per vedere l'elenco delle funzioni Bash integrate).

I processi possono essere eseguiti in primo piano, nel qual caso sequestreranno il tuo terminale fino a quando non saranno stati completati, oppure possono essere eseguiti in background. I processi in esecuzione in background non dominano la finestra del terminale e puoi continuare a lavorarci dentro. O quantomeno, non dominano la finestra del terminale se non generano un output dello schermo.

Un esempio disordinato

Inizieremo un semplice ping monitoraggio in esecuzione. andremo a ping el dominio How-To Geek. Questo verrà eseguito come una procedura in primo piano.

ping www.systempeaker.com

Otteniamo i risultati attesi, scorrendo verso il basso la finestra del terminale. Non possiamo fare nient'altro nella finestra del terminale mentre ping sta correndo. Per terminare il comando, premere Ctrl+C.

Ctrl+C

L'effetto visibile del Ctrl+C è evidenziato nello screenshot. ping fa un breve riassunto e poi si ferma.

Ripetiamolo. Ma questa volta colpiremo Ctrl+Z invece di Ctrl+C. Il compito non sarà finito. Diventerà un compito in background. Prendiamo il controllo della finestra del terminale che ci viene restituita.

ping www.systempeaker.com
Ctrl+Z

L'effetto visibile di colpire Ctrl+Z è evidenziato nello screenshot.

Questa volta ci viene detto che la procedura si interrompe. Fermato non significa finito. È come un'auto al segnale di stop. Non l'abbiamo buttato via e buttato via. Ancora in viaggio, fermato, in attesa di iniziare. La procedura ora è uno sfondo lavoro.

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

lavori
ps T

il jobs il comando ci dice:

  • [1]: Il numero tra parentesi è il numero del lavoro. Possiamo usarlo 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 usiamo un comando di controllo del lavoro senza un numero di lavoro specifico. Si chiama lavoro predefinito. Il lavoro predefinito è sempre quello che è stato aggiunto più di recente all'elenco dei lavori.
  • interrotto: La procedura non è in esecuzione.
  • ping www.systempeaker.com: La riga di comando che ha avviato la procedura.

il ps il comando ci dice:

  • PID: L'ID della procedura. Ogni procedura ha un'identificazione univoca.
  • TTY: La pseudo-telescrivente (finestra del terminale) da cui è stata eseguita la procedura.
  • STATISTICHE: Lo stato della procedura.
  • TEMPO METEREOLOGICO: La quantità di tempo della CPU consumata dalla procedura.
  • COMANDO: Il comando che ha avviato la procedura.

Questi sono valori comuni per la colonna STAT:

  • D: Sonno ininterrotto. La procedura è in uno stato di attesa, generalmente in attesa di entrata o uscita, e non può essere interrotto.
  • io: Inattivo.
  • R: Di fretta.
  • S: Sogno interrompibile.
  • T: Arrestato da un segnale di controllo del lavoro.
  • INSIEME A: Una procedura da zombie. La procedura è finita, generato “generato”.

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

  • <: Compito ad alta priorità (non piacevole per altri processi).
  • Nord: Bassa priorità (buono per altri processi).
  • l: la procedura ha pagine bloccate in memoria (regolarmente utilizzato dai processi in tempo reale).
  • S: Capo sessione. Un leader di sessione è una procedura che ha avviato gruppi di processi. Una shell è un leader di sessione.
  • io: Procedura multi-thread.
  • +: Una procedura ravvicinata.

Possiamo vedere che Bash ha uno stato di Ss. La "S" maiuscola ci dice che il guscio Bash sta dormendo ed è interrompibile. Appena ne abbiamo bisogno, rispondi a. Il “S” generato.

Il comando ping ha lo stato di T. Questo ci dice che ping è stato interrotto da un segnale di controllo del lavoro. In questo esempio, quello era il Ctrl+Z lo mettevamo in sottofondo.

il ps T il comando ha lo stato di R, cosa significa correre?. il + indica che questa procedura è un membro del gruppo in primo piano. Così lui ps T Il comando è in esecuzione in primo piano.

Il comando bg

il bg Il comando viene utilizzato per riprendere una procedura in background. Può essere utilizzato con o senza numero di lavoro. Se lo usi senza un numero di lavoro, il lavoro predefinito viene in primo piano. La procedura è ancora in esecuzione in background. Non posso inviarti alcun input.

Se emettiamo il bg comando, riprenderemo la nostra ping comando:

bg

il ping Il comando riprende e vediamo ancora una volta l'output a scorrimento nella finestra del terminale. Viene visualizzato il nome del comando che è stato riavviato. Questo è evidenziato nello screenshot.

processo di ping in background ripreso con l'uscita su una vedova terminale

Ma abbiamo un ostacolo. L'attività è in esecuzione in background e non accetta input. Quindi, Come lo fermiamo? Ctrl+C non fa nulla. Possiamo vederlo quando lo scriviamo, ma l'attività in background non riceve quelle sequenze di tasti, quindi continua a suonare felicemente.

In realtà, ora siamo in una strana modalità combo. Possiamo scrivere nella finestra del terminale, ma ciò che scriviamo è rapidamente spazzato dall'output di spostamento del ping comando. Tutto ciò che scriviamo ha effetto in primo piano.

Per interrompere la nostra attività in background, dobbiamo metterlo in primo piano e poi fermarlo.

Il comando fg

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

Se scriviamo fg Nostro ping Il comando verrà alla ribalta. I caratteri che digitiamo sono mescolati con l'output di ping comando, ma sono gestiti dalla shell come se fossero stati inseriti nella riga di comando come al solito. E in realtà, dal punto di vista della shell Bash, è esattamente quello che è successo.

fg

E ora che abbiamo il ping comando eseguito di nuovo in primo piano, possiamo usare Ctrl+C per ucciderlo.

Ctrl+C

Dobbiamo inviare i segnali giusti

Non era esattamente carino. Evidentemente, l'esecuzione di una procedura in background funziona meglio quando la procedura non produce output e non necessita di input.

Ma, disordinato o no, il nostro esempio raggiunto:

  • Metti una procedura in background.
  • Ripristina la procedura in uno stato di esecuzione in background.
  • Riportare in primo piano la procedura.
  • Finire la procedura.

Quando usi Ctrl+C e Ctrl+Z , sta inviando segnali alla procedura. Questi sono forme stenografiche usare il kill comando. esistere 64 segnali diversi Quello kill Tu puoi mandare. Usare kill -l sulla riga di comando per elencarli. kill non è l'unica fonte di questi segnali. Alcuni di essi sono generati automaticamente da altri processi all'interno del sistema.

Ecco alcuni dei più usati.

  • SIGHUP: Cartello 1. Inviato automaticamente a una procedura quando il terminale in cui è in esecuzione è chiuso.
  • SIGINT: Cartello 2. Inviato a una procedura che hai ragione. Ctrl+C. La procedura viene interrotta e ti viene chiesto di terminare.
  • SIGQUIT: Cartello 3. Inviato a una procedura se l'utente invia un segnale per smettere di fumare Ctrl+D.
  • SIGKILL: Cartello 9. La procedura si interrompe immediatamente e non tenterà di arrestarsi in modo pulito. La procedura non si svolge con grazia.
  • SIGTERM: Cartello 15. Questo è il segnale predefinito inviato da kill. È il segnale di terminazione del programma standard.
  • SIGTSTP: Cartello 20. Inviato a una procedura quando si utilizza Ctrl+Z. Interrompe la procedura e la mette in background.

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

Maggiore controllo del lavoro

Una procedura è passata in secondo piano attraverso l'uso di Ctrl+Z è posto nello stato di arresto. Dobbiamo usare il bg comando per farlo funzionare di nuovo. Avviare un programma come una procedura in esecuzione in background è facile. Aggiungi una e commerciale & alla fine della riga di comando.

Anche se è meglio che i processi in background non scrivano nella finestra del terminale, useremo esempi che lo fanno. Abbiamo bisogno di avere qualcosa negli screenshot a cui possiamo fare riferimento. Questo comando avvierà un ciclo infinito come procedura in background:

purché sia ​​vero; generato “generato”; dormire 3; fatto &

Ci viene comunicato il numero di lavoro e l'ID identificativo della procedura. Il nostro numero di lavoro è 1 e l'identificazione della procedura è 1979. Possiamo usare questi identificatori per controllare la procedura.

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 della procedura del ciclo.

ls

l'output del processo del ciclo in background intervallato dall'output di altri comandi

Per interrompere la nostra procedura possiamo usare jobs per ricordarci qual è il numero di lavoro e quindi utilizzare kill.

jobs informa che la nostra procedura è numero di lavoro 1. Per usare quel numero con kill dobbiamo precederlo con un segno di percentuale %.

lavori
uccisione %1

IMPARENTATO: Come funzionano i segnali Linux: SIGINT, SIGTERM e SIGKILL

kill invia il SIGTERM cartello, numero di segno 15, alla procedura e finisce. La prossima volta che si preme il tasto Invio, viene visualizzato lo stato del lavoro. generato “finito”. Se la procedura non risponde al kill il comando può fare un salto di qualità. Usare kill insieme a SIGKILL , numero di segno 9. Basta inserire il numero 9 Entra kill comando numero lavoro.

uccisione 9 %1

Cose che abbiamo coperto

  • Ctrl + C: Spedire SIGINT, cartello 2, alla procedura, se accetti input, e gli dice di finire.
  • Ctrl + D: Spedire SISQUIT, cartello 3, alla procedura - se stai accettando l'input - e ti dice di uscire.
  • Ctrl + INSIEME A: Spedire SIGSTP, cartello 20, alla procedura e ti dice di fermarti (sospendere) e diventa una procedura in background.
  • lavori: Elenca i lavori in background e mostra il loro numero di lavoro.
  • bg Numero di lavoro: Riavvia una procedura in background. Se non fornisci un numero di lavoro, viene utilizzata l'ultima procedura che è diventata un'attività in background.
  • fg Numero di lavoro: porta in primo piano una procedura in background e la riavvia. Se non fornisci un numero di lavoro, viene utilizzata l'ultima procedura che è diventata un'attività in background.
  • riga di comando E: Aggiungi una e commerciale & alla fine di una riga di comando esegui quel comando come attività in background, che sta correndo.
  • uccidere %Numero di lavoro: Spedire SIGTERM, cartello 15, alla procedura per finirlo.
  • uccidere 9 %Numero di lavoro: Spedire SIGKILL, cartello 9, alla procedura e la termina bruscamente.

IMPARENTATO: Come uccidere i processi dal terminale Linux

impostaTimeout(funzione(){
!funzione(F,B,e,v,n,T,S)
{Se(f.fbq)Restituzione;n=f.fbq=funzione(){n.callMethod?
n.callMethod.apply(n,argomenti):n.queue.push(argomenti)};
Se(!f._fbq)f._fbq = n;n.push=n;n.loaded=!0;n.version='2.0′;
n.coda=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(T,S) } (window, documento,'copione',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('dentro', '335401813750447');
fbq('traccia', 'Visualizzazione della pagina');
},3000);

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.