Halloween a Linux: com matar processos zombi

estampa de Halloween

Arriba el dia dels difunts i per això volem fer des LxA aquest petit tutorial per parlar dels processos zombi i de com podem matar-los. El primer dir què és això de procés zombi, i és que com sabràs el nucli Linux té un subsistema per gestionar els processos i treballa amb el scheduler per crear, variar la prioritat, enviar o treure de el flux de processament de la CPU i matar processos . Doncs bé, aquesta part de l'nucli, com la resta de sistemes tipus Unix, distingeix entre diversos estats de processos ...

Així ens podem trobar que un procés pot estar en estat sleeping (S), és a dir, adormit. També processos en estat running (R) que són aquells que estan en marxa o execució actualment, processos waiting (D) que estan detinguts a l'espera de ser atesos, gestopt (T) o suspesos, i també els zombi (Z) o difunts . Un procés zombie o difunt és aquell que ja ha estat acabat amb èxit, però que té segrestats certs recursos de sistema ja que Linux encara ho està guardant en la taula de processos. Ja saps que quan un procés acaba, no hauria de quedar-se en aquest estat, sinó que es completa i el nucli allibera els recursos perquè altres processos puguin usar-los, bàsicament allibera la memòria RAM ocupada ...

Doncs bé, com no interessa tenir aquest tipus de processos zombi, encara que no siguin tan freqüents, podem buscar-los i eliminar-los com vam indicar aquí. El primer és trobar si hi ha processos zombi en la nostra distro i per això ens podem ajudar de eines com top o com ps. Per exemple, alguna d'aquestes dues opcions:

ps -el | grep 'Z'

ps aux | grep defunct

I un cop detectat, podem matar-lo directament amb:

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

Encara que una altra alternativa és trobar als processos pare, ja que per matar un procés zombi cal matar els processos pare que el sustenten com haureu pogut deduir:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Hauràs de substituir per la identificació de l'procés zombi que hagis trobat i per matar-ho amb kill, fer servir l'identificador de l'procés pare substituint en l'exemple, evidentment.


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: AB Internet Networks 2008 SL
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   fet boles va dir

    Bon lloc!
    Sempre ens treuen del compromís.

    On diu:
    Encara que una altra alternativa és trobar els processos pare, ja que per matar un procés zombie cal matar els processos pare que el sustenten com haureu pogut deduir:

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

    Hauràs de substituir per l'ID del procés zombie que hagis trobat i per matar-lo amb kill, utilitzar l'ID del procés pare substituint a l'exemple, evidentment.

    es pot afegir l'script:

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

    és clar que no és una tasca que un usuari normal faci a cada estona.
    Només seria útil per a l'administrador, però és perillós córrer-lo com a root, perquè es pot matar qualsevol procés del sistema.

    A man kill té aquesta nota:

    NOTES Your shell (command line interpreter) mai have a built-in kill command. You may
    need to run the command descriu here as /bin/kill to solve the conflict.

    Bash té aquesta ordre, aquesta és la part de man bash sobre això:

    matar [-s sigspec | -n signum | -sigspec] [pid | ocupació]...
    matar -l|-L [sigspec | exit_status]
    Send the signal named per sigspec or signum a the processes named by pid or job‐
    spec. sigspec is either a case-insensitive signal name such as SIGKILL (with or
    without the SIG prefix) or a signal number; signum is a signal number. If
    sigspec no és present, SIGTERM és assumed. An argument of -l lists the
    signal names. If any arguments supplied when -l is given, the names of the
    signals corresponents a les argumentacions que estan llistades, i el return estat is 0.
    The exit_status argument to -l is a number specifying either a signal number or
    the exit status of process terminated by a signal. The -L option is equiva‐
    lent to -l. kill returns true if at least one signal was successfully sent, or
    false if error occurs o invalid option is encountered.

    Al principi expliquen com bash protegeix els processos, per evitar alguns problemes, però no em queda clar com podria fer un script segur per córrer com a root.
    L'únic que se m'acut és protegir-ho així:

    $cat killppid.sh
    #! / Bin / bash
    if [ $USER == «arrel» ]
    then echo No executeu $0 com a root!!! és perillós!
    sortir de
    fi

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

    $

    Fes servir el kill de bash, no /bin/kill

    Com es pot veure jo no sóc gaire versat en bash.
    Sabeu com escriure un script segur que corri com l'usuari del procés fill, encara que es corri com a root?
    una cosa equivalent al que manualment es faria així:

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