Halloween su Linux: come uccidere i processi zombie

timbro di Halloween

Il giorno dei morti sta arrivando ed è per questo che vogliamo fare questo piccolo tutorial di LxA per parlare del processi zombie e come possiamo ucciderli. La prima cosa da dire è cos'è il processo zombie, e cioè che, come sapete, il kernel Linux ha un sottosistema per gestire i processi e lavora con lo scheduler per creare, variare la priorità, inviare o rimuovere il flusso di elaborazione della CPU e uccidere i processi. Bene, questa parte del kernel, come il resto dei sistemi simili a Unix, distingue tra vari stati dei processi ...

Quindi possiamo trovarlo un processo può essere nello stato dormiente (S), cioè addormentato. Anche i processi in uno stato di esecuzione (R) che sono quelli attualmente in esecuzione o in esecuzione, i processi in attesa (D) che vengono interrotti in attesa di essere assistiti, gestiti (T) o sospesi, e anche lo zombi (Z) o il deceduto. Un processo zombie o morto è già stato terminato con successo, ma alcune risorse di sistema sono state dirottate poiché Linux le sta ancora salvando nella tabella dei processi. Sai già che quando un processo finisce, non dovrebbe rimanere in questo stato, ma si completa e il kernel libera le risorse in modo che altri processi possano usarle, in pratica libera la RAM occupata ...

Bene, poiché non è interessante avere questo tipo di processi zombi, sebbene non siano così frequenti, possiamo cercarli ed eliminarli come indicato qui. La prima cosa è scoprire se ci sono processi zombie nella nostra distribuzione e per questo possiamo aiutare noi stessi strumenti come top o come ps. Ad esempio, una di queste due opzioni:

ps -el | grep 'Z'

ps aux | grep defunct

E una volta rilevato, possiamo Uccidilo direttamente con:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Sebbene un'altra alternativa sia trovare i processi padre, dal momento che a uccidere un processo zombie Devi uccidere i processi genitore che lo sostengono, come potresti aver dedotto:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Dovrai sostituire dall'ID del processo zombie che hai trovato e per ucciderlo con kill, usa l'ID del processo genitore sostituendolo nell'esempio, ovviamente.


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile del trattamento: AB Internet Networks 2008 SL
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   palle fatte suddetto

    Buon sito!
    Ci tirano sempre fuori dai guai.

    Dove dice:
    Sebbene un'altra alternativa sia trovare i processi padre, poiché per uccidere un processo zombi devi uccidere i processi padre che lo supportano, come potresti aver dedotto:

    1 | ps -eo pid, ppid | grep
    2|
    3 | uccidere -9

    Dovrai sostituire l'ID del processo zombie che hai trovato e per ucciderlo con kill, usa l'ID del processo genitore sostituendo nell'esempio, ovviamente.

    puoi aggiungere lo script:

    $ gatto killppid.sh
    #! / Bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Naturalmente, non è un compito che un utente normale svolge sempre.
    Sarebbe utile solo per l'amministratore, ma è pericoloso eseguirlo come root, perché può uccidere qualsiasi processo sul sistema.

    In man kill ha questa nota:

    NOTE La tua shell (interprete della riga di comando) potrebbe avere un comando kill integrato. Potresti
    è necessario eseguire il comando descritto qui come /bin/kill per risolvere il conflitto.

    Bash ha quel comando, questa è la parte di man bash a riguardo:

    kill [-s sigspec | -n signum | -sigspec] [pid | specifica del lavoro] ...
    kill -l | -L [sigspec | stato_uscita]
    Invia il segnale denominato da sigspec o signum ai processi denominati da pid o job
    spec. sigspec è un nome di segnale senza distinzione tra maiuscole e minuscole come SIGKILL (con o
    senza il prefisso SIG) o un numero di segnale; signum è un numero di segnale. Se
    sigspec non è presente, quindi si assume SIGTERM. Un argomento di -l elenca il
    nomi dei segnali. Se vengono forniti argomenti quando viene fornito -l, i nomi dei
    vengono elencati i segnali corrispondenti agli argomenti e lo stato di ritorno è 0.
    L'argomento exit_status a -l è un numero che specifica un numero di segnale o
    lo stato di uscita di un processo terminato da un segnale. L'opzione -L è equivalente
    prestato a -l. kill restituisce true se almeno un segnale è stato inviato con successo, oppure
    false se si verifica un errore o se viene rilevata un'opzione non valida.

    All'inizio spiegano come bash protegge i processi, per evitare alcuni problemi, ma non mi è chiaro come potrei fare uno script sicuro da eseguire come root.
    L'unica cosa che mi viene in mente è di proteggerlo in questo modo:

    $ gatto killppid.sh
    #! / Bin / bash
    if [$ UTENTE == "radice"]
    then echo Non eseguire $ 0 come root !!! è pericoloso!
    exit
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Usa kill di bash, non / bin / kill

    Come puoi vedere che non sono molto esperto di bash.
    Sai come scrivere uno script sicuro che viene eseguito come utente del processo figlio, anche se viene eseguito come root?
    qualcosa di equivalente a ciò che verrebbe fatto manualmente in questo modo:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')