Come uccidere i processi zombie in Linux

Contenuti

Una finestra di terminale su un laptop Linux.

I programmi scritti male o malfunzionanti possono lasciare processi zombi in agguato all'interno del tuo computer Linux.. Scopri come vengono creati gli zombi e come in breve puoi lasciarli riposare.

Come funzionano gli stati procedurali in Linux

Linux, Certo, devi tenere traccia di tutte le applicazioni e i demoni in esecuzione sul tuo computer. Uno dei modi in cui lo fa è mantenendo la tabella dei processi. Questo è un elenco di strutture nella memoria del kernel. Ogni procedura ha una voce in questo elenco che contiene informazioni su di essa.

Non c'è molto in ciascuna delle strutture della tabella di processo. tengono il identificazione del processo, alcuni altri elementi di dati e un puntatore al blocco di controllo procedurale (PCB) per quella procedura.

È il PCB che contiene i molti dettagli che Linux ha bisogno di trovare o configurare per ogni procedura.. Anche il PCB si aggiorna man mano che viene creata una procedura, viene dato tempo di elaborazione e in breve viene distrutto.

Il PCB Linux contiene più di 95 campi. È definito come una struttura chiamata task_struct.he ha più di 700 Linee. Il PCB contiene i seguenti tipi di informazioni:

  • Stato della procedura: Gli stati sono descritti di seguito.
  • Numero di procedura: Il tuo identificatore univoco all'interno del sistema operativo.
  • Contatore di programma: Quando questa procedura ha accesso alla CPU, il sistema utilizzerà questo indirizzo per trovare la prossima istruzione della procedura da eseguire.
  • record: L'elenco dei registri CPU utilizzati da questa procedura. L'elenco può contenere accumulatori, registri indice e puntatori allo stack.
  • Apri elenco file: File associati a questa procedura.
  • Informazioni sulla programmazione della CPU: Utilizzato per impostare la frequenza e la durata del tempo di elaborazione della CPU per questa procedura. La priorità della procedura, gli indicatori della coda di schedulazione e altri parametri di schedulazione devono essere registrati sul PCB.
  • Informazioni sulla gestione della memoria: Dettagli sulla memoria utilizzata da questa procedura, come gli indirizzi di inizio e fine della memoria della procedura e i puntatori alle pagine di memoria.
  • E / S: Qualsiasi dispositivo di input o output utilizzato dalla procedura.

Il “Stato della procedura” può essere una delle seguenti opzioni:

  • R: Una procedura in esecuzione o eseguibile. In esecuzione significa che sta ricevendo cicli della CPU ed è in esecuzione. Una procedura eseguibile è pronta per essere eseguita e in attesa di uno slot della CPU.
  • S: Una procedura per dormire. La procedura è in attesa del completamento di un'azione, come operazione di input o output, o che una risorsa è disponibile.
  • D: La procedura è in stato di sospensione ininterrotta. Stai utilizzando una chiamata di sistema bloccante e non puoi continuare finché le chiamate di sistema non sono state completate. A differenza dello stato di “sospensione”, una procedura in questo stato non risponderà ai segnali finché la chiamata di sistema non sarà completata e l'esecuzione sarà tornata alla procedura.
  • T: La procedura è finita (fermato) perché ha ricevuto il SIGSTOP cartello. Quella risponderò solo al SIGKILL oh SIGCONT segni, che uccidono la procedura o ti dicono di continuare, rispettivamente. Ecco cosa succede quando cambi primo piano (fg) per sfondo (bg) Lavoretti.
  • INSIEME A: Una procedura da zombie. Quando una procedura è completata, semplicemente non va via. Libera qualsiasi memoria tu stia utilizzando e si rimuove dalla memoria, ma la sua entrata nella tabella di processo e PCB rimane. Il suo stato è impostato su EXIT_ZOMBIE, e viene notificata la sua procedura madre (per lui SIGCHLD cartello) che la procedura del bambino è terminata.

Nello stato di zombi, la procedura genitore chiama uno dei wait() famiglie di funzioni quando viene creata la procedura figlio. Quindi attendere un cambiamento di stato nella procedura figlio. La procedura del bambino è stata interrotta?, continuato o eliminato da un segnale? Hai finito per eseguire il completamento naturale del tuo codice??

Se il cambio di stato è uno, significa che la procedura figlio ha interrotto l'esecuzione, il tuo codice di uscita è stato letto. Dopo, il PCB del bambino viene distrutto e la sua voce nella tabella delle procedure viene rimossa. Idealmente, tutto questo accade in un batter d'occhio, e i processi nello stato di zombi non esistono a lungo.

IMPARENTATO: Come eseguire e controllare i processi in background in Linux

Quali sono le cause dei processi zombie in Linux?

Una procedura padre errata potrebbe non chiamare il wait() funzione quando viene creata la procedura figlio. Ciò significa che nulla è in attesa dei cambiamenti di stato nella procedura del bambino, e il SIGCHLD il segnale verrà ignorato. O forse un'altra applicazione sta influenzando l'esecuzione della procedura principale, a causa di una cattiva programmazione o di intenti malevoli.

Nonostante questo, se la procedura del genitore non è a conoscenza dei cambiamenti di stato nella procedura del bambino, non si verificherà una corretta manutenzione del sistema. La scheda PCB e la voce della tabella di processo non verranno rimosse al termine della procedura figlio. Questo fa sì che lo stato zombie non venga mai rimosso dal PCB..

Gli zombi usano un po' di memoria, ma generalmente non rappresentano un ostacolo. La voce nella tabella dei processi è piccola, ma, fino a quando non sarà pubblicato, l'ID della procedura non può essere riutilizzato. Su un sistema operativo di 64 bit, è improbabile che ciò causi problemi perché il PCB è molto più grande della voce della tabella di processo.

Un sacco di zombie potrebbero, possibilmente, influenzare la quantità di memoria libera per altri processi. Nonostante questo, se hai così tanti zombi, hai un serio ostacolo con l'applicazione principale o un errore del sistema operativo.

Come rimuovere i processi Zombie

Non puoi uccidere una procedura zombi perché è già morta. Non risponderà a nessun segnale perché è stato rimosso dalla memoria; non c'è nessun posto dove inviare a SIGKILL cartello. Puoi provare a inviare il SIGCHLD segnale al genitore procedura, ma se non ha funzionato al termine della procedura figlio, improbabile che funzioni neanche adesso.

L'unica soluzione affidabile è rimuovere la procedura principale. Quando finisce, i suoi processi figli sono ereditati dal init processi, che è la prima procedura da eseguire su un sistema Linux (il tuo ID procedura è 1).

il init La procedura esegue regolarmente la necessaria pulizia degli zombi, quindi per ucciderli, devi solo uccidere la procedura che li ha creati. il top Il comando è un modo conveniente per vedere se hai degli zombi.

Scrivi quanto segue:

superiore

Questo sistema ha otto processi zombie. Noi puoi elencare questi usando il ps comando e incanalandolo in egrep. Un'altra volta, I processi Zombie hanno un flag di stato di “INSIEME A” e, generalmente, vedrai anche tu “estinto”.

Scrivi quanto segue:

ps a | egrep "INSIEME A|defunta"

I processi zombie sono elencati.

Questo è un modo più accurato per capire gli ID procedurali degli zombi rispetto allo scorrimento avanti e indietro top. Vediamo anche che un'applicazione chiamata “badprg” generato questi zombie.

L'ID della procedura del primo zombie è 7641, ma dobbiamo trovare l'id della procedura della sua procedura padre. Possiamo farlo usando ps ancora. Useremo l'opzione di uscita (-o) raccontare ps per mostrare solo l'ID della procedura del genitore e poi passarlo con il ppid= bandiera.

La procedura che vogliamo trovare sarà indicata tramite il -p (processi) e poi passa la procedura id dello zombi.

Perché, scriviamo il seguente comando per trovare le informazioni sulla procedura per la procedura 7641, ma riporterà solo l'ID della procedura principale:

ps -o ppid = -p 7641

Ci è stato detto che l'ID della procedura principale è 7636. Ora possiamo fare un riferimento incrociato usando ps un'altra volta.

Vediamo che questo corrisponde al nome della procedura principale sopra. Per uccidere la procedura principale, usa l'opzione SIGKILL con il comando kill come segue:

uccidere -SIGKILL 7636

A seconda del proprietario della procedura principale, è possibile che dovresti anche usare sudo.

Gli zombi non fanno paura …

... A meno che non siano in un'orda enorme. Alcuni non sono nulla di cui preoccuparsi e un semplice riavvio li rimuoverà.

Nonostante questo, se noti che un'applicazione o una procedura genera sempre zombi, è qualcosa che devi analizzare. Molto probabilmente è solo un programma scritto in modo approssimativo, in quale caso, forse c'è una versione aggiornata che pulisce correttamente dopo i suoi processi figlio.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.