I programmi che sono scarsamente scritti o si esibiscono male possono andarsene Processi di zombie in agguato all'interno del tuo computer Linux. Scopri come vengono creati gli zombi e come puoi finalmente metterli a riposare.
Come gli stati di processo funzionano su Linux
Linux, ovviamente, deve tenere traccia di tutte le applicazioni e dai demoni in esecuzione sul tuo computer. Uno dei modi che fa questo è mantenendo la tabella dei processi. Questo è un elenco di strutture nella memoria del kernel. Ogni processo ha una voce in questo elenco che contiene alcune informazioni a riguardo.
Non c'è molto da ciascuna delle strutture della tabella di processo. Tengono il ID Processo , alcuni altri elementi di dati e un puntatore al blocco di controllo del processo (PCB) per tale processo.
È il PCB che tiene i tanti dettagli che Linux deve cercare o impostare per ogni processo. Il PCB viene anche aggiornato come processo è stato creato, dato il tempo di elaborazione e infine distrutto.
Il PWB Linux contiene oltre 95 campi.
È definito
Come una struttura chiamata
task_struct.h.
, e sono lunghe oltre 700 righe. Il PCB contiene i seguenti tipi di informazioni:
- Stato di processo : Gli stati sono descritti di seguito.
- Numero di processo : Il suo identificativo univoco all'interno del sistema operativo.
- Contatore di programma : Quando questo processo è il prossimo dato accesso alla CPU, il sistema utilizzerà questo indirizzo per trovare le prossime istruzioni del processo che dovrebbe essere eseguita.
- Registri : L'elenco dei registri della CPU utilizzati da questo processo. L'elenco potrebbe contenere accumulatori, registri indicizzati e puntatori di stack.
- Apri elenco di file : File associati a questo processo.
- Informazioni di pianificazione della CPU : Utilizzato per determinare quanto frequentemente, e per quanto tempo, il tempo di elaborazione della CPU viene assegnato a questo processo. La priorità del processo, i puntatori di pianificazione delle code e altri parametri di pianificazione devono essere registrati nel PCB.
- Informazioni sulla gestione della memoria : Dettagli sulla memoria Questo processo utilizza, ad esempio gli indirizzi di inizio e fine della memoria del processo e dei puntatori delle pagine di memoria.
- I / O Informazioni sullo stato : Eventuali dispositivi di uscita o di uscita utilizzati dal processo.
Lo "stato di processo" può essere uno dei seguenti:
- R: Un processo in esecuzione o declable. Significato che significa che riceve cicli e esecuzione della CPU. Un processo runnicabile è pronto per funzionare e in attesa di uno slot della CPU.
- S: Un processo di sonno. Il processo sta aspettando un'azione da completare, ad esempio un'operazione di uscita o di uscita o per una risorsa per diventare disponibile.
- D: Il processo è in uno stato di sonno ininterrotto. Utilizza una chiamata di sistema di blocco e non può continuare finché le chiamate di sistema non sono state completate. A differenza dello stato "Sleep", un processo in questo stato non risponderà ai segnali fino a quando la chiamata di sistema non sarà completata e l'esecuzione è stata restituita al processo.
-
T:
Il processo è terminato (fermato) perché ha ricevuto il
SIGSTOP.segnale. Esso risponderà solo alSigkill.oSigcont.segnali, che uccidono il processo o si istruiscono a continuare, rispettivamente. Questo è ciò che sta succedendo quando si scambia da primo piano (FG.) a sfondo (BG)compiti. -
Z:
Un processo zombie. Quando un processo è completato, non solo svanisce. Libera la memoria che si sta utilizzando e si rimuove dalla memoria, ma la sua voce nella tabella dei processi e il PCB rimangono. Il suo stato è impostato su
Exit_zombie.e il suo processo genitore è notificato (dalSigchld.segnale) che il processo figlio ha finito.
Nello stato zombie, il processo genitore chiama uno dei
aspettare()
Famiglie di funzioni
quando il processo figlio è stato creato. Quindi attende un cambiamento di stato nel processo figlio. Il processo figlio è stato fermato, continuò o ucciso da un segnale? Ha terminato correndo attraverso il completamento naturale del suo codice?
Se il cambiamento di stato è uno che significa che il processo figlio ha smesso di funzionare, il codice di uscita è letto. Quindi, il PCB del bambino viene distrutto e la sua voce nella tabella di processo viene rimossa. Idealmente, tutto ciò accade in un batter d'occhio e i processi nello stato zombie non esistono per molto tempo.
IMPARENTATO: Come eseguire e controllare i processi di sfondo su Linux
Cosa causa i processi di zombie su Linux?
Un processo genitore mal scritto potrebbe non chiamare il
aspettare()
funzione quando viene creato il processo figlio. Ciò significa che nulla sta guardando i cambiamenti di stato nel processo figlio, e il
Sigchld.
il segnale verrà ignorato. O forse un'altra applicazione sta influenzando l'esecuzione del processo genitore, a causa di scarsa programmazione o intenti maliziosi.
Tuttavia, se il processo genitore non sta guardando per le modifiche allo stato nel processo figlio, il corretto servizio di pulizia del sistema non si verificherà. Il PCB e la voce nella tabella dei processi non verranno rimossi quando il processo figlio termina. Ciò si traduce nello stato zombie non viene mai rimosso dal PCB.
Gli zombie usano un po 'di memoria, ma di solito non rappresentano un problema. La voce nella tabella dei processi è piccola, ma finché non viene rilasciata, l'ID del processo non può essere riutilizzato. Su un sistema operativo a 64 bit, è improbabile che causi qualsiasi problema perché il PCB è molto più grande della voce della tabella di processo.
Un enorme numero di zombi potrebbe, concepibilmente, influenzare la quantità di memoria che è gratuita per altri processi. Se hai tanti zombi, però, hai un problema serio con l'applicazione genitore o un bug del sistema operativo.
Come rimuovere i processi zombie
Non puoi uccidere un processo zombie perché è già morto. Non risponderà a nessun segnale perché è stato rimosso dalla memoria: non c'è nessun posto dove inviare a
Sigkill.
segnale. Puoi provare a inviare il
Sigchld.
Segnale al processo genitore, ma se non ha funzionato quando il processo figlio ha terminato, è improbabile che funzioni ora.
L'unica soluzione affidabile è quella di uccidere il processo genitore. Quando è terminato, i suoi processi figlio sono ereditati dal
dentro
Processo, che è il primo processo da eseguire in un sistema Linux (il suo ID processo è 1).
Il
dentro
Il processo esegue regolarmente la pulizia necessaria degli zombi, quindi per ucciderli, devi solo uccidere il processo che li ha creati. Il
superiore
Il comando è un modo conveniente per vedere se hai uno zombie.
Digita quanto segue:
Top
Questo sistema ha otto processi zombie. Noi
può elencare questi.
usando il.
Ps.
comando
e lo conducono in
egrep.
. Ancora una volta, i processi di zombie hanno una bandiera dello stato di "Z" e di solito vedrai anche "defunct".
Digita quanto segue:
PS AUX | egrep "z | defunct"
I processi zombie sono elencati.
Questo è un modo neater per scoprire gli ID del processo degli zombi che scorrere avanti e indietro
superiore
. Vediamo anche che un'applicazione chiamata "BadpRG" ha generato questi zombi.
L'ID del processo del primo Zombie è 7641, ma dobbiamo trovare l'ID del processo del suo processo genitore. Possiamo farlo usando
ancora. Utilizzeremo l'opzione di output (
Ps.
-o
) dire
Ps.
Per visualizzare solo l'ID del processo del genitore, quindi passarlo con il
PPID =.
bandiera.
Il processo che vogliamo trovare sarà indicato usando il
-P
(Processo) opzione, quindi passando nell'ID del processo di Zombie.
Pertanto, digitiamo il seguente comando per cercare le informazioni di processo per il processo 7641, ma segnalerà solo l'ID del processo genitore:
PS -O PPID = -P 7641
Ci è stato detto che l'ID del processo genitore è 7636. Possiamo ora fare riferimento a cross-referent questo usando
Ps.
ancora una volta.
Vediamo questo corrisponde al nome del processo genitore da precedenti. Per uccidere il processo genitore, utilizzare l'opzione SIGKILL con il comando Kill come segue:
Kill -sigkill 7636
A seconda del proprietario del processo genitore, potrebbe anche essere necessario utilizzare
sudo.
.
Gli zombi non sono spaventosi ...
... A meno che non siano in una massiccia orda. Alcuni non sono nulla di cui preoccuparsi e un semplice riavvio li cancellerà.
Tuttavia, se si nota che un'applicazione o un processo è sempre a deviare gli zombi, è qualcosa che dovresti esaminare. È molto probabilmente solo un programma scritto con lo stesso, nel qual caso, forse c'è una versione aggiornata che pulisce correttamente dopo i suoi processi figlio.