Aby linuxákům nebylo líto
Aby linuxákům nebylo líto, že si nemůžou spouštět kalkulačku podle návodu z minulého článku, tak pro ně mám taky něco, čím i oni můžou zabavit svůj počítač, aby se zbytečně nenudil.
Takže milý Linuxáci, Unixáci, BSDčkaři, spusťte si terminál a napište do něj toto:
:(){ :|:& };:
Nic? A Enter jsem zmáčkli? (-;
Vo co go
Takže co že to vlastně „žabák se čtyřmi bradavkami, zauzlovanými střevy a erekcí“(( © Pixy, další výklad smajlíka od dgx hledejte v komentářích)) dělá? Ne Roji, kalkulačku to nespouští (-;
Jedná se o příkaz v shellu (funguje ve většině moderních shellů) a trochu přehledněji se dá rozepsat třeba takhle:

Pro pokročilé znalce shellu může být trochu zavádějící ta
dvojtečka, které normálně znamená prázdný výraz, ale zde si ji
předefinujeme. Sřetězení rourou | má čistě estetický
význam. Příkaz by mohl vypadat taky :&;:& tzn.
spuštění dvojtečky dvakrát na pozadí.
Tento záludný příkaz vlastně nedělá nic.
Jen se nekontrolovaně množí. Pokaždé spustí dvakrát sám
sebe. Nic nedělání vypadá samo o sobě neškodně, ale pokaždé když se
spouští nový příkaz, musí se pro něj v paměti vyhradit aspoň
minimální místo. Takže množící se příkaz zabírá v paměti stále
víc místa a velmi rychle ji zaplní celou. Pak už s počítačem nelze
udělat nic jiného, než ho netvrdo restartovat.
Mechanismu, kterým dochází k vytváření dalších procesů na urovni
operačního systému se říká fork. Právě služba
fork vyhrazuje novému procesu místo v paměti. Proto se
příkazům fungujícím na podobném principu nekontrolovaného vytváření
nových procesů říká fork bomba.
V čem je problém
Fork bomba není žádnou novinkou, dá se napsat v podstatě v libovolném programovacím jazyce, který umožňuje spouštět nové procesy a spustit se dá na nejrůznějších operačních systémech. Například na Windows vám stačí spustit dávkový soubor, který bude obsahovat příkazy
:s start %0 goto s
dgx prosím nezkoušej to (-;
Problém je ovšem v tom, že zatímco na pracovní stanici vás nějaké to vytuhnutí většinou nerozhodí, na serveru to může být pořádný problém. Když začne vinou množících se procesů docházet paměť, operační systém se rozhodne likvidovat procesy, které se nejvíc roztahují. Bohužel to většinou bývají ty, co mají něco na práci. Takže když spustíte fork bombu na webovém serveru, začně první živořit Apache až vám nakonec úplně umře. Pak může ještě nějakou chvíli trvat, než do programového nebíčka odejdou i ostatní programy a operační systém se rozhodne, že nejlepší bude spáchat restartovací harakiri. Je celkem jasné, že server je během tohoto pomalého umírání zcela neovladatelný a i když se pak probere, nemusí jen tak lehce naběhnout, protože zůstal nekonzistentní souborový systém.
Co s tím
Vystrašila jsem vás aspoň trochu předchozím odstavcem? Jestli jo, tak to jsem ráda. Takže co se s tím dá udělat?
1. Zamyslete se nad tím, komu dáváte na stroji účet (uživatelský, o rootu ani nemluvím). I hodní a bezelstní lidé mohou mít „všelijaké kamarády“((zdravíme Lordrata! ((-;)), nebo číst špatné blogy a kopírovat si z nich do příkazové řádky divné smajlíky.
2. už vidím Věroše, jak v komentářích nerovózně podupává,
takže ano, už je to tady – na unixech se dá nastavit limit na
počet procesů spuštěných jedním uživatelem. Nastavuje se pomocí
ulimit -u počet procesů. Pouze je při nastavování
potřeba myslet na to, že limit se přenáší pouze na potomky shellu
ve kterém byl nastaven. Jestli máte nějaký limit nastavený,
zjistíte pomocí příkazu ulimit -a a najdete ho pod označením
max user processes. Ty ostatní informace, které se tam na vás
vyvalí jsou taky zajímavý. Takže když už budete limity nastavovat, tak
„help ulimit“((kvízová otázka: proč „help“ a ne
„man“?)) a můžete to vzít jedním vrzem. A kdyby se vám náhodou
porařilo zjistit, jak ulimit počítá ty procesy, tak mi dejte vědět. Už
nad tím sedím dvě hodiny, článek furt nedopsanej a přijít na to
nemůžu…
Komentáře k článku:
Nie je to smajlik indickeho boha vojny ?
Říká se mu „program co vás donutí natvrdo zrestartovat Windows i s rozdělanou prací“?
Hlavně to nikdo nezkoušejte spouštět!
Badly placed ()'s.
(csh)
2dgx> super! prave jsem se chtela zeptat, jestli to funguje i v Cygwinu (-;
jinak ve windows se to dela nativne trochu jinak. spusti se batak s timto kodem:
2×ert> no jo no…
:-P
ale v shcku pekne, neznal
Grrr zvědavost mi nedovolila nezkusit to :o) Alespoň jsem díky dgx nepřišel o žádný data.
Nechápu, ale pln důvěry v Žirafku spustil. Výsledek:
Nadále nechápu a doufám, že počítač za chvíli neexploduje.
2×ert> No ja jsem kvuli tobe testovala jak by to slo udelat z csh (neslo, zrejme v nem nejdou definovat funkce) a pri te prilezitosti jsem si odpalila system. Nojono… Kdo jinemu jamu bagr, sam do ni parasutista.
2Tonda> Slibuju, ze tohle je posledni clanek ve kterem zneuzivam lidskou zvedavost. Teda minimalne tenhle mesic posledni.
2pixy> JO! Mac OS X boduje!
A prozradíš taky někdy, o co jde a co jsem si v tom počítači právě spáchal?
2pixy> Zitra. Jeste cekam na Roje ((-;
ale Ty zrovna muzes byt klidnej. nic jsi tam neudelal. MacOS X je evidentne chytrej software a nedovolil Ti to. Ovsem kdyz ted napisu, ze takhle ma vypadat operacni system, tak si tu zadelam na peknej flamewar.
Tak to se mi ulevilo. Ale stejně bych nikdy nevěřil, že jakýsi smajlík žabáka se čtyřmi bradavkami, zauzlovanými střevy a erekcí může v comandlajně něco spustit… {:-o
ad pixy:
Toho žabáka je pro Zirafku potřeba přeložit, čte smajlíky jinak. Takže, není to žabák, nýbrž postarší panna s orlím nosem, knírem, dvouřadovýma prsama a zdviženou sukní, pod níž je vidět vyzývavě otevřená hencto, což ovšem vzhledem ke zbytku fyziognomie tak úplně vyzývavě nepůsobí. Vlastně… s takovýma smajlíkama jdi někam!
dgx se plete, ten žabák s erekcí jenom dělá stojku.
A nepomohl by inteligentně nastavený ulimit?
Zkousel jsem to spustit v emulatoru Linuxu na widlich, ale spustilo to jen karkulacku. Zirafko, uz muzes :-)
K linuxovy masine nemam ted pripojenej monitor a ten ctyricetikilovej tam tahat nebudu :-)
U mě se to chovalo asi tak. Prvních pár vteřin jsem byl ještě schopnej trochu hýbat myší, ale pak už ani to ne. Bylo to celý nějaký zaciklený. Spuštěno v terminálu pod Gnome, nešlo vyřešit ani přes ctr + c či ctr + alt + backspace. Nedočkavě čekám na objasnění – co že to vlastně je – už se necítím pod Linuxem tak bezpečně jako doposud :o).
--- Zirafa ma znasilnila ---
donutila ma dat jej na blog text: cau ujo zirafka, ako k tomu prideme ze dnes, v 25. storoci, davas na web fork bomby a ludia si ich este aj spustaju?
a teraz k tomu, kto rata tie procesy:
To, ze vobec existuju procesy, je iluzia ktoru nam vytvara operacny system. Aby to dokazal, vo svojej pamati (v pamati jadra) si drzi zoznam vsetkych existujucich procesov. V pripade linuxu je to zretazeny zoznam struktur task_struct, definovanu v /usr/include/linux/sched.h, kazda jedna vyplnena tato strukturka znamena jeden proces (task). Procesy ktore bezia pod jednym userom vsetky ukazuju aj na inu strukturu, user_struct, definovanu v tom istom subore. Ta obsahuje pocet procesov, suborov a dalsie limity toho-ktoreho pouzivatela.
Ked sa chce proces rozmnozit, zavola funkciu jadra fork(). Kdesi akosi (v /usr/src/linux/kernel/fork.c) sa vramci toho zavola funkcia copy_process, ktora ma za ulohu vykonat hlavnu cast forkovania. No a presne ona obsahuje:
if (atomic_read(&p->user->processes) >= p->signal->rlim[RLIMIT_NPROC].rlim_cur) { if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) && p->user != &root_user) goto bad_fork_free; } atomic_inc(&p->user->__count); atomic_inc(&p->user->processes);Po slovensky:
ak (pocet procesov U pouzivatela Z aktualneho procesu >= limit na maximalny pocet procesov, nastaveny na aktualnom procese) { ak (user nie je root) { fork zlyha, KONIEC; } } inak ZVYS pocet procesov ktore dany user ma spustene.Takze kontroluje to jadro, na tom mieste kde forkuje.
Postrehy na zaver:
Teda Žirafko, to zírám… Dvojtečku jako název fce bych teda fakt nečekal. {:-o
BTW chlapi, taky vám připadá taková chytrá ženská, co dokáže zasvěceně mluvit o junixu a programování, děsně sexy i na dálku? :D
2pixy> teda ja se cervenam snad az do #FFOOOO…
ale v pohode. ja si povest zase brzo nejakym clankem pokazim (-:
2www> jeste tobe nesmim zapomenout podekovat pred nastoupenou jednotkou za to, ze jsi podlehl memu znasilneni. (-;
Raději jsem to rozeslal těm několika málo linuxákům co mám v kontakt listu, abych z toho nebyl vyplivlej sám :o) .
Možná by tam mělo být napsaný „pro bashisty“, v ksh to nic neudela.
Váš komentář: