Unix / Linux - Gestione dei processi

In questo capitolo, discuteremo in dettaglio sulla gestione dei processi in Unix. Quando esegui un programma sul tuo sistema Unix, il sistema crea un ambiente speciale per quel programma. Questo ambiente contiene tutto il necessario affinché il sistema esegua il programma come se nessun altro programma fosse in esecuzione sul sistema.

Ogni volta che si immette un comando in Unix, viene creato o avviato un nuovo processo. Quando hai provato il filelscomando per elencare il contenuto della directory, hai avviato un processo. Un processo, in termini semplici, è un'istanza di un programma in esecuzione.

Il sistema operativo tiene traccia dei processi tramite un numero ID a cinque cifre noto come pid o il process ID. Ogni processo nel sistema ha un unicopid.

I Pid alla fine si ripetono perché tutti i numeri possibili sono esauriti e il PID successivo rotola o ricomincia. In qualsiasi momento, nel sistema non esistono due processi con lo stesso pid perché è il pid che Unix utilizza per tenere traccia di ciascun processo.

Avvio di un processo

Quando avvii un processo (esegui un comando), ci sono due modi per eseguirlo:

  • Processi in primo piano
  • Processi in background

Processi in primo piano

Per impostazione predefinita, ogni processo avviato viene eseguito in primo piano. Riceve il suo input dalla tastiera e invia il suo output allo schermo.

Puoi vedere che questo accade con il lscomando. Se desideri elencare tutti i file nella directory corrente, puoi utilizzare il seguente comando:

$ls ch*.doc

In questo modo verranno visualizzati tutti i file, i cui nomi iniziano con ch e termina con .doc -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Il processo viene eseguito in primo piano, l'output viene diretto al mio schermo e se il file ls comando vuole qualsiasi input (cosa che non fa), lo attende dalla tastiera.

Mentre un programma è in esecuzione in primo piano e richiede molto tempo, non è possibile eseguire altri comandi (avviare altri processi) perché il prompt non sarebbe disponibile fino a quando il programma non termina l'elaborazione e viene visualizzato.

Processi in background

Un processo in background viene eseguito senza essere connesso alla tastiera. Se il processo in background richiede un input da tastiera, attende.

Il vantaggio di eseguire un processo in background è che puoi eseguire altri comandi; non devi aspettare fino al termine per avviarne un altro!

Il modo più semplice per avviare un processo in background è aggiungere una e commerciale (&) alla fine del comando.

$ls ch*.doc &

Questo mostra tutti quei file i cui nomi iniziano con ch e termina con .doc -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Qui, se il file ls Il comando vuole qualsiasi input (cosa che non fa), va in uno stato di stop fino a quando non lo spostiamo in primo piano e gli forniamo i dati dalla tastiera.

La prima riga contiene informazioni sul processo in background: il numero del lavoro e l'ID del processo. È necessario conoscere il numero del lavoro per manipolarlo tra lo sfondo e il primo piano.

Premi il tasto Invio e vedrai quanto segue:

[1]   +   Done                 ls ch*.doc &
$

La prima riga ti dice che il file lsil processo in background del comando termina correttamente. Il secondo è un prompt per un altro comando.

Elenco dei processi in esecuzione

È facile vedere i propri processi eseguendo il file ps (stato del processo) come segue:

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

Uno dei flag più comunemente usati per ps è il -f (f per intero), che fornisce ulteriori informazioni come mostrato nell'esempio seguente:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

Ecco la descrizione di tutti i campi visualizzati da ps -f comando -

Sr.No. Colonna e descrizione
1

UID

ID utente a cui appartiene questo processo (la persona che lo esegue)

2

PID

ID processo

3

PPID

ID processo padre (l'ID del processo che lo ha avviato)

4

C

Utilizzo della CPU del processo

5

STIME

Ora di inizio del processo

6

TTY

Tipo di terminale associato al processo

7

TIME

Tempo di CPU impiegato dal processo

8

CMD

Il comando che ha avviato questo processo

Ci sono altre opzioni che possono essere utilizzate insieme a ps comando -

Sr.No. Opzione e descrizione
1

-a

Mostra le informazioni su tutti gli utenti

2

-x

Mostra le informazioni sui processi senza terminali

3

-u

Mostra informazioni aggiuntive come l'opzione -f

4

-e

Visualizza informazioni estese

Arresto dei processi

La conclusione di un processo può essere eseguita in diversi modi. Spesso, da un comando basato su console, l'invio di una sequenza di tasti CTRL + C (il carattere di interruzione predefinito) farà terminare il comando. Funziona quando il processo è in esecuzione in modalità primo piano.

Se un processo è in esecuzione in background, dovresti ottenere il suo ID lavoro utilizzando il file pscomando. Dopodiché, puoi usare il filekill comando per terminare il processo come segue:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

Qui, il kill il comando termina il first_oneprocessi. Se un processo ignora un normale comando kill, puoi usarekill -9 seguito dall'ID del processo come segue:

$kill -9 6738
Terminated

Processi padre e figlio

A ogni processo unix sono assegnati due numeri ID: l'ID processo (pid) e l'ID processo padre (ppid). Ogni processo utente nel sistema ha un processo padre.

La maggior parte dei comandi che esegui hanno la shell come genitore. Controlla ilps -f esempio in cui questo comando elencava sia l'ID processo che l'ID processo padre.

Processi zombi e orfani

Normalmente, quando un processo figlio viene terminato, il processo genitore viene aggiornato tramite un file SIGCHLDsegnale. Quindi il genitore può svolgere qualche altra attività o riavviare un nuovo bambino, se necessario. Tuttavia, a volte il processo genitore viene interrotto prima che il suo figlio venga ucciso. In questo caso, il "genitore di tutti i processi", ilinitprocesso, diventa il nuovo PPID (ID processo genitore). In alcuni casi, questi processi sono chiamati processi orfani.

Quando un processo viene interrotto, a ps l'elenco potrebbe ancora mostrare il processo con l'estensione Zstato. Questo è un processo zombie o defunto. Il processo è morto e non viene utilizzato. Questi processi sono diversi dai processi orfani. Hanno completato l'esecuzione ma trovano ancora una voce nella tabella dei processi.

Processi daemon

I demoni sono processi in background relativi al sistema che spesso vengono eseguiti con le autorizzazioni di root e le richieste di servizi da altri processi.

Un demone non ha un terminale di controllo. Non può aprirsi/dev/tty. Se fai un file"ps -ef" e guarda il file tty campo, tutti i daemon avranno l'estensione ? per il tty.

Per essere precisi, un demone è un processo che viene eseguito in background, solitamente in attesa che accada qualcosa con cui è in grado di lavorare. Ad esempio, un demone della stampante in attesa di comandi di stampa.

Se hai un programma che richiede una lunga elaborazione, allora vale la pena renderlo un demone ed eseguirlo in background.

Il comando superiore

Il top Il comando è uno strumento molto utile per mostrare rapidamente i processi ordinati in base a vari criteri.

È uno strumento diagnostico interattivo che si aggiorna frequentemente e mostra informazioni sulla memoria fisica e virtuale, sull'utilizzo della CPU, sulle medie di carico e sui processi occupati.

Ecco la semplice sintassi per eseguire il comando top e per vedere le statistiche di utilizzo della CPU da parte di diversi processi:

$top

ID lavoro e ID processo

I processi in background e sospesi vengono solitamente manipolati tramite job number (job ID). Questo numero è diverso dall'ID del processo e viene utilizzato perché è più breve.

Inoltre, un lavoro può essere costituito da più processi in esecuzione in serie o contemporaneamente, in parallelo. L'utilizzo dell'ID lavoro è più semplice che tenere traccia dei singoli processi.