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.