Mivel kell a <defunct> processzt gyilkolni?

Fórumok

Mivel kell a <defunct> processzt gyilkolni?

Hozzászólások

[quote:3f41ff6c64="kupcsik"]Mi van, ha a parent az init? (pid=1) Akkor a zombi mar orokre ott marad (marmint rebootig?)

Elvben a 'telinit u' segíthet, bár kipróbálni hál'Istennek még nem volt módom.

[quote:80d8458cb6="kupcsik"]
Mi van, ha a parent az init? (pid=1) Akkor a zombi mar orokre ott marad (marmint rebootig?)

Az init elvileg rendesen gyepálja az ilyen zombi gyerekeket, vagyis gondoskodik róla, hogy azok eltűnjenek. Ha mégsem, akkor az bug az init programban.

[quote:1c461c4c08="cln"]viszont a ps még mindig azt írja ki hogy a fut a kliens program.

A zombi (defunct) processz már nem fut. Már kilépett. Pusztán kevéske adminisztratív infót még nyilvántart róla a rendszer. Ennek tudtommal két célja van. Az egyik, hogy a szülő ki tudja deríteni a visszatérési értéket, processzoridő-használati statisztikáit stb. A másik pedig, hogy ha a szülő szignált kíván neki küldeni, akkor ezt race condition nélkül megtehesse (ti. nem lehetséges, hogy épp a szignál küldése előtti pillanatban valami miatt kilép a gyerek és a PID-ját egy tök más processz számára kiosztja a kernel).

[quote:e83081fa22="kupcsik"]Kérdés:

Mi van, ha a parent az init? (pid=1) Akkor a zombi mar orokre ott marad (marmint rebootig?)

Hát igen. De amúgy még ilyet nem láttam. Mármint hogy az init legyen a parent.:)

[quote:e99b64898b="gyorffy"]
Hát igen. De amúgy még ilyet nem láttam. Mármint hogy az init legyen a parent.:)

Ésazthogy? Az init a legfelsőbb szülő. A processek, akiknek nem 'látod' a szüleit, az mind az init gyermekei. Ő a 'master parent' :) Szóval ha láttál már futó rendszert, akkor muszály volt látnod, hogy az initnek van gyermeke, ergo van olyan folyamat, aminek az init a szülője :D

[quote:3ec48b8aa2="gyorffy"]Hát igen. De amúgy még ilyet nem láttam. Mármint hogy az init legyen a parent.:)

man init elso sora: "Init is the parent of all processes."

[quote:226b0d07c8="snq-"][quote:226b0d07c8="gyorffy"]Hát igen. De amúgy még ilyet nem láttam. Mármint hogy az init legyen a parent.:)

man init elso sora: "Init is the parent of all processes."

Úgy értettem, hogy defunct process és közvetlen parentje legyen az ini. :roll:
És, hogy ne lője ki.

[quote:876f2f1d2e="snq-"]"Init is the parent of all processes."

Ez a mondat hibás a man page-ben. Helyesen kb. így hangzana: "Init is the ancestor of all processes."

[quote:04aad9870d="egmont"][quote:04aad9870d="snq-"]"Init is the parent of all processes."

Ez a mondat hibás a man page-ben. Helyesen kb. így hangzana: "Init is the ancestor of all processes."

Szerintem meg helyes, kb. annyira mint, hogy Ádám a mi ős apánk :lol:

[quote:c55d481f21="kupcsik"]Kérdés:

Mi van, ha a parent az init? (pid=1) Akkor a zombi mar orokre ott marad (marmint rebootig?)

Az én esetemben ez nem fordulhat elő mert előtte van még néhány sh nevű processz is, ami valószínűsíti a többszintű leállíthatóságot.
Hogy egy kicsit meg is magyarázzam a perl által előállított adat útvonalát:
Adatbázis_szerver --> kliens --> report_kimenet --> perl --> sendmail --> mail_szerver --> kliens_gép.
Itt a perl körül lehet valami bibi.

ELaci

[quote:49d1cfab41="cln"][quote:49d1cfab41="kupcsik"]Kérdés:

Mi van, ha a parent az init? (pid=1) Akkor a zombi mar orokre ott marad (marmint rebootig?)

Az én esetemben ez nem fordulhat elő mert előtte van még néhány sh nevű processz is, ami valószínűsíti a többszintű leállíthatóságot.
Hogy egy kicsit meg is magyarázzam a perl által előállított adat útvonalát:
Adatbázis_szerver --> kliens --> report_kimenet --> perl --> sendmail --> mail_szerver --> kliens_gép.
Itt a perl körül lehet valami bibi.

ELaci

Nekem is voltak ilyen gondjaim. Python alól. Pl. ha egy olyan subprocesszt hívtam meg, ami stdoutra és stderr-re is logolt, de nem kezeltem az stderr kimenetet. Az segített, hogy subprocess hívásakor lezártam a process file descriptorait, a stderr-jét pedig átirányítottam az stdoutra, és együtt figyelem a kimenetét, majd ha befejezte a process a futást, az összes leíróját egy None változóra irányítom...de ez már csak a Python GC segítése miatt van. Nekem így megszűntek a zombi processzek, eleinte voltak, amíg nem így csináltam.

Nekem is voltak ilyen gondjaim. Python alól. Pl. ha egy olyan subprocesszt hívtam meg, ami stdoutra és stderr-re is logolt, de nem kezeltem az stderr kimenetet. Az segített, hogy subprocess hívásakor lezártam a process file descriptorait, a stderr-jét pedig átirányítottam az stdoutra, és együtt figyelem a kimenetét, majd ha befejezte a process a futást, az összes leíróját egy None változóra irányítom...de ez már csak a Python GC segítése miatt van. Nekem így megszűntek a zombi processzek, eleinte voltak, amíg nem így csináltam.

A megérzésem alapján nálam is valami output zűrzavar lehet mert a perl program egy pipe, és a forrása a kliens outputja, valamint futása közben több file-t is kezel. Ezeket kellene valahogy normálisan lezárni abban az esetben is ha a user pl. megszakítást eszközöl futás közben.

ELaci

[quote:3f9ee0f4ac="gyorffy"]Szerintem meg helyes, kb. annyira mint, hogy Ádám a mi ős apánk :lol:

:-))) Na jó, egyezzünk ki abban, hogy félreérthető...

Az INIT folyamat minden folyamat ősannya. Vagyis az egyetlen folyamat, amelynek nincs szülője. Ha egy folyamat szülője hamarabb kilép, mint a gyermeke, abban az esetben az INIT folyamat lesz az adott gyermek folyamat szülője. Így az INIT fogja majd kiolvasni a gyermek folyamat viszatérési állapottábláját. Elméletileg ez garantálja azt, hogy egy folyamat se legyen <defunct>, ha a szülöje kilép. Persze attól még előfordulhat az, hogy a szülője nem lép ki(vagyis tovább fut), és ugyanakkor a wait() vagy waitpid() függvényekkel nem hajlandó kiolvasni a gyermeke visszatérési értékét(programozási hiba). Ilyenkor ha leállítják a hibás szülő folyamatot, akkor az INIT örökli a gyermek folyamatot és az majd garantáltan megteszi a visszatérési állapot kiolvasását. Íly módon a gyermek folyamat szabályos módon fejezi be futását. Persze csak elméletileg. :)

Bosszantó módon időnként a perl nem lép ki normálisan, hanem visszamarad egy zombi processz amit a "kill -9" -el sem lehet kigyilkolni.
Milyen alkalmas eszköz lehet még erre?
Sytem: HPUX11, perl 5.8.0

ELaci

A szülő processzét kell agyonlőni, más nincs. A zombie állapot ugyanis azt jelenti, hogy a processz (akár rendesen, akár hibával, de) kilépett, viszont az őt indító processz kérte, hogy a kilépés után ne szabaduljon fel automatikusan minden, mert rá akar nézni a kilépési státuszra (rendesen lépett-e ki, ha igen, milyen kóddal, signal rúgta-e le, ha igen, melyik, stb.). Elviekben a szülő processz ilyenkor vagy a wait()-tel, vagy a waitpid()-del várja, de várja, így aztán a zombie státusz csak az alatt aktív, amíg a fenti infókat feldolgozza. Ha tartósan zombie, akkor valami a szülő processzben el van kerálva, és bár indított al-processzt, de fütyül várni az eredményre.

Nagy a valószínűsége hogy valóban a parent processzt kell leállítani ami jelen esetben egy adatbázis kliens. A dolog eddig rendben is volna, csakhogy az adatbázis szerverhez kapcsolódó klienst kill-el nem szabad leállítani klf. okoknál fogva. A szerverhez tartozik egy kliens shutdown program amivel ezeket az eseteket szoktam megoldani. Ez a user le is lett kapcsolva az adatbázisról, tehát a listában nem szerepel, viszont a ps még mindig azt írja ki hogy a fut a kliens program. Hülye egy helyzet.
Valszeg csak akkor fog megszünni a zombi amikor az egész adatbázis éjfélkor újraindul.

ELaci

Összeszedtem egy kis bátorságot és leállítottam a parent processzt a kill -el, és a zombi is megszünt. Most már csak arra kellene rájönnöm hogy a perl -el mit kellene babrálnom hogy az ilyen eset minél ritkábban fordulhasson elő.

ELaci

Kérdés:

Mi van, ha a parent az init? (pid=1) Akkor a zombi mar orokre ott marad (marmint rebootig?)