Come eseguire e controllare i processi in background su Linux

Un ambiente shell su un computer Linux.

Fatmawati Achmad Zaenuri/Shutterstock.com



Usa la shell Bash in Linux per gestire i processi in primo piano e in background. Puoi utilizzare le funzioni e i segnali 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 in un sistema operativo Linux o Unix, viene avviato un processo. Processo è il nome della rappresentazione interna del programma in esecuzione nella memoria del computer. C'è un processo per ogni programma attivo. In effetti, esiste un processo per quasi tutto ciò che è in esecuzione sul tuo computer. Ciò include i componenti del tuo ambiente desktop grafico (GDE) come GNOME o DOVE e sistema demoni che vengono lanciati all'avvio.





Come mai 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 |_+_| in una finestra di terminale per vedere l'elenco dei built-in di Bash.)

I processi possono essere eseguiti in primo piano, nel qual caso prendono il controllo del tuo terminale fino al completamento, 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 un semplice |_+_| traccia in esecuzione . Stiamo andando a |_+_| il dominio How-To Geek. Questo verrà eseguito come un processo in primo piano.

help

Annuncio pubblicitario

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



ping

L'effetto visibile del |_+_| è evidenziato nello screenshot. |_+_| fa un breve riassunto e poi si ferma.

Ripetiamolo. Ma questa volta colpiremo |_+_| invece di |_+_|. L'attività non verrà terminata. Diventerà un compito in background. Otteniamo il controllo della finestra del terminale restituita a noi.

ping ping

L'effetto visibile di colpire |_+_| è evidenziato nello screenshot.

Questa volta ci viene detto che il processo è stato interrotto. Interrotto non significa terminato. È come un'auto al segnale di stop. Non l'abbiamo rottamato e buttato via. È ancora sulla strada, fermo, in attesa di partire. Il processo è ora uno sfondo lavoro .

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

Ctrl+C Ctrl+C

Il |_+_| comando ci dice:

    [uno]: Il numero tra parentesi quadre è 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 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 |_+_| comando ci dice:

    PID: L'ID del processo. Ogni processo ha un ID univoco. TTY: la pseudo-telescrivente (finestra del terminale) da cui è stato eseguito il processo. STATO: lo stato del processo. VOLTA: 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: Sonno ininterrotto. Il processo è in uno stato di attesa, solitamente in attesa di input o output, e non può essere interrotto. io: Oziare. R: In esecuzione. S: Sonno interrompibile. T: Arrestato da un segnale di controllo del lavoro. CON: Un processo zombie. Il processo è stato terminato ma non è stato ripulito dal processo padre.
Annuncio pubblicitario

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 ad altri processi). L: il processo ha pagine bloccate in memoria (tipicamente utilizzato 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 di |_+_|. La S maiuscola ci dice che il guscio 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 |_+_|. Questo ci dice che |_+_| è stato interrotto da un segnale di controllo del lavoro. In questo esempio, quello era il |_+_| lo mettevamo in sottofondo.

Il |_+_| il comando ha uno stato |_+_|, che sta per esecuzione. Il |_+_| indica che questo processo è un membro del gruppo in primo piano. Quindi il |_+_| comando è in esecuzione in primo piano.

Il comando bg

Il |_+_| comando viene utilizzato per riprendere un processo in background. Può essere utilizzato con o senza un numero di lavoro. Se lo usi 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, riprenderemo il nostro |_+_| comando:

ping

Annuncio pubblicitario

Il |_+_| 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.

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 accetterà input. Allora come lo fermiamo? |_+_| non fa niente. Possiamo vederlo quando lo digitiamo, ma l'attività in background non riceve quelle sequenze di tasti, quindi continua a eseguire il ping allegramente.

In effetti, ora siamo in una strana modalità mista. Possiamo digitare nella finestra del terminale ma ciò che scriviamo viene rapidamente spazzato via dall'output a scorrimento del |_+_| comando. Tutto ciò che digitiamo ha effetto in quanto sopra.

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

Il comando fg

Il |_+_| comando porterà un'attività in background in primo piano. Proprio come il |_+_| comando, può essere utilizzato con o senza numero di lavoro. Usarlo con un numero di lavoro significa che funzionerà su un lavoro specifico. Se viene utilizzato senza un numero di lavoro, viene utilizzato l'ultimo comando inviato in background.

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

Ctrl+Z

Annuncio pubblicitario

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

Ctrl+C

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 funzionato:

  • Mettere un processo in secondo piano.
  • Ripristino del processo in esecuzione in background.
  • Riportare il processo in primo piano.
  • Terminare il processo.

Quando usi |_+_| e |_+_| , stai inviando segnali al processo. Questi sono modi abbreviati di usare il |_+_| comando. Ci sono 64 segnali diversi che |_+_| Posso inviare. Usa |_+_| alla riga di comando per elencarli. |_+_| 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 che hai premuto |_+_|. Il processo viene interrotto e viene detto di terminare. TANTO: Segnale 3. Inviato a un processo se l'utente invia un segnale di chiusura |_+_|. SIGKILL: Segnale 9. Il processo viene immediatamente interrotto e non tenterà di chiudersi in modo pulito. Il processo non va giù con grazia. SIGTERM: Segnale 15. Questo è il segnale predefinito inviato da |_+_|. È il segnale standard di terminazione del programma. SIGTSTP: Segnale 20. Inviato a un processo quando si utilizza |_+_|. Arresta il processo e lo mette in background.

Dobbiamo usare |_+_| comando per emettere segnali a cui non sono assegnate combinazioni di tasti.

Ulteriore controllo del lavoro

Un processo è passato in secondo piano usando |_+_| viene posto nello stato di arresto. Dobbiamo usare |_+_| comando per riavviarlo. Avviare un programma come un processo in esecuzione in background è 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. Abbiamo bisogno di avere qualcosa negli screenshot a cui possiamo fare riferimento. Questo comando avvierà un ciclo infinito come processo in background:

Annuncio pubblicitario

mentre vero; do echo How-To Geek Loop Processo; dormire 3; fatto &

Ci viene comunicato il numero del lavoro e l'ID processo del processo. Il nostro numero di lavoro è 1 e l'ID 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 di ciclo.

ls

l

Per fermare il nostro processo possiamo usare |_+_| per ricordarci qual è il numero di lavoro, quindi utilizzare |_+_|.

|_+_| segnala che il nostro processo è il lavoro numero 1. Per utilizzare quel numero con |_+_| dobbiamo precederlo con un segno di percentuale |_+_|.

Ctrl+Z jobs

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

|_+_| invia il |_+_| segnale, segnale numero 15, al processo ed è terminato. Alla successiva pressione del tasto Invio, viene mostrato lo stato del lavoro. Elenca il processo come terminato. Se il processo non risponde al |_+_| comando puoi fare un salto di qualità. Usa |_+_| con |_+_| , segnale numero 9. Basta inserire il numero 9 tra |_+_| comandare il numero di lavoro.

ps

Cose che abbiamo trattato

    Ctrl+C: Invia |_+_|, segnale 2, al processo, se sta accettando input, e gli dice di terminare. Ctrl+D: Invia |_+_|, segnale 3, al processo, se sta accettando input, e gli dice di uscire. Ctrl+Z: Invia |_+_|, 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 numero di lavoro : riavvia un processo in background. Se non fornisci un numero di lavoro, viene utilizzato l'ultimo processo che è stato trasformato in un'attività in background. fg numero di lavoro : porta in primo piano un processo in background e lo riavvia. Se non fornisci un numero di lavoro, viene utilizzato l'ultimo processo che è stato trasformato in un'attività in background.
  • riga di comando & : Aggiunta di una e commerciale |_+_| alla fine di una riga di comando esegue quel comando come attività in background, che è in esecuzione.
  • uccisione % numero di lavoro : Invia |_+_|, segnale 15, al processo per terminarlo. uccidere 9 % numero di lavoro : Invia |_+_|, segnale 9, al processo e lo interrompe bruscamente.

IMPARENTATO: Come terminare i processi dal terminale Linux

Comandi Linux
File catrame · pv · gatto · tac · chmod · presa · differenza · sed · Con · uomo · spinto · popd · fsck · testdisk · seguito · fd · pandoc · cd · $PATH · awk · giuntura · jq · piega · unico · journalctl · coda · stato · ls · fstab · buttato fuori · meno · chgrp · chown · rev · Guarda · stringhe · genere · rinominare · cerniera lampo · decomprimere · montare · smontare · installare · fdisk · mkfs · rm · rmdir · rsync · df · gpg · noi · nano · mkdir · a partire dal · ln · toppa · convertire · rclone · brandello · SRM
Processi alias · schermo · superiore · Bello · renice · progresso · strace · sistema · tmux · chsh · storia · in · lotto · libero · quale · dmesg · usermod · ps · chroot · xargs · tty · mignolo · lsof · vmstat · tempo scaduto · parete · · uccisione · dormire · sudo · il suo · volta · gruppoaggiungi · usermod · gruppi · lshw · spegnimento · riavviare · fermare · spegni · passwd · lscpu · crontab · Data · bg · fg
Rete netstat · ping · traceroute · ip · ss · chi è · fail2ban · bmon · voi · dito · nmap · ftp · arricciare · wget · chi · chi sono · In · iptables · ssh-keygen · ufw

IMPARENTATO: I migliori laptop Linux per sviluppatori e appassionati

LEGGI SUCCESSIVO Foto del profilo di Dave McKay Dave McKay
Dave McKay ha usato per la prima volta i computer quando era in voga il nastro di carta perforata, 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 Data Protection Officer. I suoi scritti sono stati pubblicati da howtogeek.com, cloudavvyit.com, itenterpriser.com e opensource.com. Dave è un evangelista di Linux e un sostenitore dell'open source.
Leggi la biografia completa

Articoli Interessanti