Un processo zombie in Linux si riferisce a quei processi già morti ma, in un modo o nell'altro, sono ancora presenti nella tabella dei processi del sistema. La scappatoia è che, per qualche motivo, questo processo non è stato ripulito dal genitore dalla tabella dei processi. Di solito, ciò accade dopo il completamento del processo di esecuzione.
Il solito modo di operare in Linux è che dopo che un processo ha completato la sua esecuzione, notifica il suo genitore, che è responsabile della rimozione del processo dalla tabella. Sfortunatamente, il genitore non è in grado di rimuovere il processo dalla memoria nei casi in cui il genitore non può leggere lo stato del bambino. Questo è il modo in cui abbiamo processi morti nella tabella dei processi. Questi sono quelli che chiamiamo processi zombi.
Cosa causa i processi Zombie di Linux?
Quando viene creato il processo figlio, un processo padre scritto male potrebbe non riuscire a chiamare la funzione wait(). Di conseguenza, i suoi figli zombi rimarranno nella memoria fino a quando non saranno estinti.
Ciò significa che nulla sta monitorando il processo infantile per i cambiamenti di stato e il segnale SIGCHLD verrà ignorato. Forse un'altra applicazione sta interferendo con l'esecuzione del processo principale, a causa di una programmazione scadente o di intenzioni dannose.
La corretta gestione del sistema non si verificherà se il processo padre non controlla i cambiamenti di stato nel processo figlio.
Al termine del processo iniziale, il PCB e la voce nella tabella del processo non verranno rimossi. Di conseguenza, lo stato di zombi non viene mai rimosso dal PCB.
Gli zombi hanno un po' di memoria, ma di solito non è un problema. Poiché i sistemi Linux hanno un numero finito di PID (sebbene un numero elevato), se un numero sufficiente di PID viene sottoposto a zombi, nessun altro processo può iniziare. È dubbio che ciò accadrà.
Tuttavia, i processi zombi suggeriscono che qualcosa è andato storto con un'applicazione e che un programma specifico potrebbe avere un bug.
I bug del software nei data center non devono essere tollerati e devono essere risolti.
Da tenere d'occhio cercare e distruggere i processi zombi fino a quando l'errore non viene risolto.
L'ID processo non può essere riutilizzato finché non viene avviato, quindi la voce della tabella di processo è minuscola.
Poiché il PCB è molto più grande della voce della tabella di processo in un sistema operativo a 64 bit, è improbabile che ciò causi problemi .
La quantità di memoria disponibile per altri processi potrebbe essere influenzata da un gran numero di zombie. Tuttavia, se hai così tanti zombi, hai un grave problema con l'applicazione principale o un bug nel sistema operativo.
Quindi, cosa fai quando una procedura si trasforma in uno zombi? Rintracci ed elimini i processi zombie.
Come trovare un processo zombi?
L'arresto iniziale per uccidere un processo zombi nel sistema è prima di tutto identificarlo. Poiché il processo di init pulisce regolarmente gli zombi, tutto ciò che devi fare per sbarazzartene è distruggere il processo che li ha creati.
Il comando in alto è un modo rapido per vedere se ci sono zombi nella tua zona. Per ottenere ciò, eseguiremo il seguente comando.
top
Il numero di processi zombie in questo sistema verrà mostrato sull'output. Nel nostro caso sopra, abbiamo 0 zombi.
Usando il comando ps e inserendolo in egrep, possiamo ottenerne un elenco. Il flag di stato per i processi zombi è "Z" e a volte vedrai anche "defunto".
tuts@fosslinux:~$ ps aux | egrep "Z|defunct"
Analizziamo le varie sezioni di questo comando.
Z nella colonna STAT dell'output identifica un processo zombie.
[defunct] nell'ultima colonna (COMANDO) dell'output identifica anche un processo zombie.
Idealmente, non è possibile uccidere un processo Zombie perché è morto. Al contrario, informiamo il genitore di tentare di leggere lo stato del processo del bambino e infine di pulirlo dalla tabella del sistema. Per attivare questo processo, inviamo un segnale SIGCHLD al genitore del processo. L'identificazione dell'ID del processo padre o del cosiddetto PID implica l'esecuzione del comando seguente:
tuts@fosslinux:~$ ps -o ppid= <Child PID>
Dopo aver ottenuto il PID dello zombi, usa il segnale di comando SIGCHLD per i processi principali identificati in precedenza.
tuts@fosslinux:~$ kill -s SIGCHLD <Parent PID>
In alcuni casi, questo non cancella il processo Zombie. Questo ci chiama a impegnarci nel piano b o c. Il prior comporta il riavvio del processo padre o l'uccisione dei processi padre. D'altra parte, questi ultimi casi comportano il riavvio del sistema, specialmente quando il processo Zombie potrebbe causare un'interruzione o un'impennata massiccia a causa del processo Zombie.
Di seguito è riportato il comando per terminare il processo padre.
tuts@fosslinux:~$ kill -9 <Parent PID>
Nel caso in cui un processo padre venga interrotto, per estensione, vengono eliminati anche tutti i processi figlio del genitore specificato. Nel caso in cui uno dei processi figlio sia critico in un determinato momento, potrebbe essere necessario posticipare l'uccisione fino a quando non sarà sicuro. D'altra parte, un rapido doppio controllo può dirti quanta memoria o potenza di elaborazione stanno consumando i processi Zombie. Questo aiuta a determinare se l'opzione migliore è uccidere il processore principale per eseguire un riavvio del sistema nel ciclo successivo della manutenzione del sistema già pianificata.
Su Linux, come funzionano gli stati dei processi?
Naturalmente, Linux deve tenere traccia di tutte le applicazioni e i demoni in esecuzione sul tuo computer. Il mantenimento della tabella dei processi è uno dei modi in cui riesce a farlo.
Questo è un elenco di strutture di memoria del kernel. Questo elenco include una voce per ogni processo che contiene alcune informazioni su di esso. Ciascuna delle strutture delle tabelle di processo contiene pochissime informazioni.
Memorizzano l'ID del processo, alcune altre informazioni e un puntatore al blocco di controllo del processo (PCB).
Il PCB è il luogo in cui Linux memorizza tutte le informazioni di cui ha bisogno per cercare o impostare per ogni processo. Quando un processo viene creato, viene modificato, viene assegnato il tempo di elaborazione e quindi distrutto.
Ci sono oltre 95 campi sul PCB Linux. È definito nella struttura dell'attività, che è lunga oltre 700 righe. Sul PCB è possibile trovare i seguenti tipi di informazioni:
Gli stati del processo sono illustrati di seguito
- Numero di processo:l'identificatore distintivo del sistema operativo.
- Contatore programma:quando a questo processo viene concesso nuovamente l'accesso alla CPU, il sistema utilizzerà questo indirizzo per individuare l'istruzione successiva del processo da eseguire.
- Registri:questa procedura utilizza un elenco di registri della CPU chiamati registri. Nell'elenco possono essere inclusi accumulatori, registri di indice e puntatori di stack.
- Elenco file aperti:i file associati a questa procedura sono inclusi nell'elenco file aperti.
- Informazioni sulla pianificazione della CPU:utilizzate per calcolare con quale frequenza e per quanto tempo questo processo riceve il tempo di elaborazione della CPU.
Il PCB deve registrare la priorità del processo, i puntatori alle code di pianificazione e altri parametri di pianificazione. - Informazioni sulla gestione della memoria:informazioni sulla memoria utilizzata da questo processo, come gli indirizzi di inizio e fine della memoria di processo, nonché i puntatori alle pagine di memoria.
- Informazioni sullo stato degli I/O:tutti i dispositivi che il processo utilizza come ingressi o uscite.
Uno dei seguenti può essere lo "Stato del processo":
- R:un processo in esecuzione o in grado di essere eseguito. È in esecuzione, il che significa che sta ricevendo ed eseguendo cicli della CPU.
Una procedura pronta per l'esecuzione è in attesa di uno slot CPU. - S:L'atto di dormire.
Il processo è in attesa del completamento di un'azione, ad esempio un'operazione di input o output. O la disponibilità di una risorsa. - D:La procedura è in uno stato di sonno non interrompibile. Sta utilizzando una chiamata di sistema di blocco, il che significa che non procederà fino al completamento delle chiamate di sistema. A differenza dello stato "Sleep", un processo in questo stato non risponderà ai segnali finché la chiamata di sistema non sarà completata e l'esecuzione non sarà tornata al processo.
- T:Poiché ha ricevuto il segnale SIGSTOP, il processo è terminato (fermato).
Risponderà solo ai segnali SIGKILL o SIGCONT, uccidendo o ordinando al processo di continuare. Quando passi dalle attività in primo piano (fg) a quelle in background (bg), ciò accade. - Z:sta per Zombie Process. Quando un processo è terminato, non semplicemente scompare. Invece, libera tutta la memoria che sta attualmente utilizzando ed esce dalla memoria, ma la voce della tabella dei processi e il PCB rimangono.
Il suo stato è impostato su EXIT ZOMBIE e al processo padre viene detto che il processo figlio è stato completato tramite il Segnale SIGCHLD.
Conclusione
A meno che non facciano parte di una vasta orda, gli zombi non sono così dannosi. Alcuni non sono un grosso problema e un rapido riavvio li cancellerà. Tuttavia, c'è un punto da considerare.
Le architetture Linux hanno un numero massimo di processi e, di conseguenza, un numero massimo di numeri ID processo. Quando viene raggiunto il numero massimo di processi zombie di un computer, non è possibile avviare nuovi processi.
I processi zombie non sono processi; sono i resti di processi morti che il loro processo padre non ha ripulito correttamente. Tuttavia, se noti che una particolare applicazione o processo genera costantemente zombi, dovresti indagare ulteriormente.
Molto probabilmente, è solo un programma scritto male; in tal caso, forse c'è una versione aggiornata che si pulisce dopo che il suo figlio è stato elaborato correttamente.