/ / Kas ir “zombiju process” uz Linux?

Kas ir “zombiju process” uz Linux?

Ja esat Linux lietotājs, iespējams, esat redzējis zombiju procesus, kas spīd ap jūsu procesu sarakstu. Jūs nevarat nogalināt zombiju procesu, jo tas jau ir miris - tāpat kā īsts zombijs.

Zombiji pamatā ir mirušieprocesus, kas nav pareizi iztīrīti. Programma, kas rada zombiju procesus, nav pareizi ieprogrammēta - tām nav paredzēts ļaut zombiju procesiem pielipt.

Kas ir zombiju process?

Lai saprastu, kas ir zombiju process un kas izraisa zombiju procesus, jums mazliet jāsaprot, kā procesi darbojas Linux.

Kad process nomirst operētājsistēmā Linux, tas vēl nav vissnekavējoties tiek noņemts no atmiņas - tā procesa deskriptors paliek atmiņā (procesa deskriptors aizņem tikai nelielu atmiņas daudzumu). Procesa statuss kļūst EXIT_ZOMBIE, un procesa vecākam tiek paziņots, ka tā bērna process ir miris ar SIGCHLD signālu. Pēc tam vecāku procesam ir paredzēts izpildīt gaidīšanas () sistēmas zvanu, lai lasītu mirušā procesa izejas statusu un citu informāciju. Tas ļauj vecāku procesam iegūt informāciju no mirušā procesa. Pēc gaidīšanas () izsaukšanas zombiju process tiek pilnībā noņemts no atmiņas.

Parasti tas notiek ļoti ātri, tāpēc jūs to nedarīsitskatiet zombiju procesus, kas uzkrājas jūsu sistēmā. Tomēr, ja vecāku process nav pareizi ieprogrammēts un nekad neaicina gaidīt (), tā zombiju bērni paliek atmiņā, līdz viņi tiek sakopti.

Komunālie pakalpojumi, piemēram, GNOME System Monitor, tops komandu un ps komandu displeja zombiju procesi.

attēls

Zombiju procesu briesmas

Zombiju procesi neizmanto nevienu sistēmuresursiem. (Faktiski katrs no tiem procesa apraksta glabāšanai izmanto ļoti nelielu daudzumu sistēmas atmiņas.) Tomēr katrs zombiju process saglabā savu procesa ID (PID). Linux sistēmām ir ierobežots skaits procesa ID - 32 bitu sistēmās pēc noklusējuma ir 32767. Ja zombiji uzkrājas ļoti ātri - piemēram, ja nepareizi ieprogrammēta servera programmatūra rada zombiju procesus zem slodzes - viss pieejamo PID fonds galu galā tiek piešķirts zombiju procesiem, neļaujot citiem procesiem sākties.

Tomēr daži zombiju procesi, kas karājas apkārt, nav problēma - lai gan tie tomēr norāda uz kļūdu jūsu vecāku procesā jūsu sistēmā.

attēls

Atbrīvošanās no zombiju procesiem

Jūs nevarat nogalināt zombiju procesus, jo jūs varat nogalinātnormāli procesi ar SIGKILL signālu - zombiju procesi jau ir beigušies. Ņemiet vērā, ka jums nav jāatbrīvojas no zombiju procesiem, ja vien jūsu sistēmā nav daudz līdzekļu - daži zombiji ir nekaitīgi. Tomēr ir daži veidi, kā atbrīvoties no zombiju procesiem.

Viens veids ir SIGCHLD signāla nosūtīšana vecāku procesam. Šis signāls mātes procesam liek izpildīt gaidīšanas () sistēmas izsaukumu un iztīrīt savus zombiju bērnus. Nosūtiet signālu ar nogalināt komanda, aizstājot pid zemāk esošajā komandā ar pamatprocesa PID:

nogalināt -s SIGCHLD pid

Tomēr, ja vecāku process nav ieprogrammētspareizi un ignorējot SIGCHLD signālus, tas nepalīdzēs. Jums būs jānogalina vai jāslēdz zombiju vecāku process. Kad process, kas izveidoja zombijus, beidzas, init manto zombiju procesus un kļūst par viņu jauno vecāku. (init ir pirmais process, kas sākts operētājsistēmā Linux, un tam tiek piešķirts PID 1.) init periodiski izpilda gaidīšanas () sistēmas aicinājumu sakopt savus zombiju bērnus, tāpēc init veiks īsu zombiju darbu. Pēc tā aizvēršanas varat restartēt vecāku procesu.

Ja vecāku process turpina radīt zombijus, tas jāfiksē tā, lai tas pareizi izsauktu gaidīšanu (), lai gūtu labumu no zombiju bērniem. Iesniedziet ziņojumu par kļūdu, ja programma jūsu sistēmā turpina radīt zombijus.