Sobes.tech
Middle

Hogyan lehet befejezni egy zombie folyamatot az operációs rendszerben?

sobes.tech MI

Válasz az MI-től

Egy zombi folyamat (defunct process) olyan folyamat, amely befejezte végrehajtását, de bejegyzése még mindig megtalálható a folyamat táblában (PCB - Process Control Block) a rendszerben, várva arra, hogy a szülő folyamat olvassa a befejezési állapotát a wait() vagy waitpid() rendszerhívás segítségével. Ha a szülő folyamat nem teszi ezt meg, vagy korábban fejeződik be, a zombi megmarad.

Nem lehet közvetlenül befejezni a zombi folyamatot, mivel már nem futtat kódot. A "befejezéshez":

  1. A szülő folyamat megölése. Amikor a szülő folyamat befejezi, az operációs rendszer (init vagy systemd) elfogadja az összes árva gyermekfolyamatát. Az új szülő folyamat (PID 1) általában végrehajtja a wait()-et a gyermekfolyamatokra, összegyűjtve azok befejezési állapotát, és lehetővé téve a rendszer számára, hogy teljesen felszabadítsa a zombi által foglalt erőforrásokat.

    # A zombi folyamat PID-jének megtalálása
    ps aux | grep 'Z'
    
    # A ps kimenetből a szülő folyamat PPID-jének megtalálása
    # Példa kimenet: USER   PID  %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    # ...  1234  0.0  0.0      0     0 ?        Z    HH:MM   0:00 [zombie_process] <defunct>
    # A PPID másik mezőben lesz, vagy meg kell találni a szülő PID-jét nézve a 1234-es PID-t
    # Használja a pstree vagy ps -o pid,ppid,stat,cmd parancsokat
    
    # A szülő folyamat megölése (helyettesítse <PPID>-t a valódi PPID-vel)
    kill -9 <PPID>
    
  2. A rendszer újraindítása. Ez a legegyszerűbb, bár radikális módszer, amely garantálja a folyamatok táblájának tisztítását.

Megjegyzés: Néha a zombi folyamatok programhibából keletkeznek, ahol a szülő folyamat elfelejt wait()-et hívni a gyermekfolyamatok létrehozása után. Ilyen esetekben a programkód javítása hosszú távú megoldás.