Kas yra „zombių procesas“ Linux?
Jei esate „Linux“ naudotojas, galbūt matėte zombių procesus, susijusius su procesų sąrašu. Jūs negalite nužudyti zombių proceso, nes jis jau yra miręs - kaip tikrasis zombis.
Zombiai iš esmės yra negyvi procesai, kurie nebuvo tinkamai išvalyti. Programa, kuria sukuriami zombio procesai, nėra tinkamai užprogramuota - programos neturėtų leisti zombių procesams.
Vaizdo kreditas: Daniel Hollister dėl „Flickr“ („Remixed“)
Kas yra Zombie procesas?
Norint suprasti, kas yra zombių procesas ir kas sukelia zombių procesus, turite šiek tiek suprasti, kaip procesai veikia „Linux“.
Kai procesas „Linux“ miršta, jis iš karto nepašalinamas iš atminties - jo proceso deskriptorius lieka atmintyje (proceso deskriptorius užima tik mažą atminties kiekį). Proceso būsena tampa EXIT_ZOMBIE ir proceso tėvui pranešama, kad jo vaiko procesas mirė su SIGCHLD signalu. Tuomet tėvų procesas turėtų įvykdyti laukimo () sistemos skambutį, kad būtų galima perskaityti mirusio proceso išėjimo būseną ir kitą informaciją. Tai leidžia tėvų procesui gauti informaciją iš mirusio proceso. Po laukimo () yra vadinamas zombių procesas iš atminties.
Tai paprastai vyksta labai greitai, taigi jūsų sistemoje nematysite zombių procesų. Tačiau, jei tėvų procesas nėra tinkamai užprogramuotas ir niekada neprašo laukti (), jo zombių vaikai bus laikomi atmintyje, kol jie bus išvalyti.
Komunalinės paslaugos, tokios kaip GNOME System Monitor, viršuje komandą ir ps komandų ekranas zombių procesai.
Zombių procesų pavojai
Zombių procesai nenaudoja jokių sistemos išteklių. (Tiesą sakant, kiekvienas naudoja labai mažą sistemos atminties kiekį, kad išsaugotų savo proceso deskriptorių.) Tačiau kiekvienas zombių procesas išlaiko savo proceso ID (PID). „Linux“ sistemose yra baigtinis procesų ID skaičius - 32767 pagal 32 bitų sistemas. Jei zombiai kaupiasi labai greitai - pavyzdžiui, jei netinkamai užprogramuota serverio programinė įranga sukuria zombių procesus apkrovai - visas galimų PID fondų galiausiai bus priskirtas zombių procesams, neleidžiant kitiems procesams pradėti..
Tačiau keletas zombių procesų, kurie vyksta aplinkui, nėra problema - nors jie nurodo klaidą su savo tėvų procesu jūsų sistemoje.
Atsikratyti Zombie procesų
Jūs negalite nužudyti zombių procesų, nes galite nužudyti normalius procesus SIGKILL signalu - zombių procesai jau yra mirę. Turėkite omenyje, kad nereikia atsikratyti zombių procesų, nebent turite didelę sumą savo sistemoje - keli zombiai yra nekenksmingi. Tačiau yra keletas būdų, kaip atsikratyti zombių procesų.
Vienas iš būdų yra SIGCHLD signalo siuntimas į pagrindinį procesą. Šis signalas nurodo tėvų procesui, kad jis vykdytų „laukimo“ () sistemos skambutį ir išvalytų savo zombių vaikus. Siųskite signalą nužudyti komandą, pakeičiančią pid toliau pateikiamoje komandoje su tėvų proceso PID:
nužudyti S SIGCHLD pid
Tačiau, jei tėvų procesas nėra tinkamai užprogramuotas ir ignoruoja SIGCHLD signalus, tai nepadės. Turėsite nužudyti ar uždaryti zombių tėvų procesą. Baigiantis zombių kūrimo procesui, init paveldi zombių procesus ir tampa jų naujuoju tėvu. („init“ yra pirmasis procesas, prasidėjęs „Linux“ įkrovos metu ir priskiriamas PID 1.) init periodiškai atlieka laukimo () sistemos skambutį, kad išvalytų savo zombių vaikus, todėl „init“ atliks trumpą zombių darbą. Po uždarymo galite iš naujo paleisti tėvų procesą.
Jei tėvų procesas tęsia zombių kūrimą, jis turėtų būti nustatytas taip, kad jis tinkamai išklausytų (), kad gautų savo zombių vaikus. Įrašykite klaidos ataskaitą, jei jūsų sistemoje esanti programa toliau kuria zombius.