Blog

Aby linuxákům nebylo líto

24.4.2007 v 4:44 PM

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? (-;


Doplnění 25.4.2007 v 11:00 PM

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:

avatar
geck
Úterý 24. 04. 2007 v 15:11

Nie je to smajlik indickeho boha vojny ?

Úterý 24. 04. 2007 v 15:58

jak se tomuhle typu programu říká

Říká se mu „program co vás donutí natvrdo zrestartovat Windows i s rozdělanou prací“?

Hlavně to nikdo nezkoušejte spouštět!

avatar
xert
Úterý 24. 04. 2007 v 16:38

Badly placed ()'s.

(csh)

Úterý 24. 04. 2007 v 16:39

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:

:s
start %0
goto s

2×ert> no jo no…

avatar
xert
Úterý 24. 04. 2007 v 16:42

:-P

ale v shcku pekne, neznal

Úterý 24. 04. 2007 v 17:11

Grrr zvědavost mi nedovolila nezkusit to :o) Alespoň jsem díky dgx nepřišel o žádný data.

avatar
pixy
Úterý 24. 04. 2007 v 18:07

Nechápu, ale pln důvěry v Žirafku spustil. Výsledek:

[1] 22848
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
...
^C

Nadále nechápu a doufám, že počítač za chvíli neexploduje.

Úterý 24. 04. 2007 v 18:35

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!

avatar
pixy
Úterý 24. 04. 2007 v 19:08

A prozradíš taky někdy, o co jde a co jsem si v tom počítači právě spáchal?

Úterý 24. 04. 2007 v 19:17

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.

avatar
pixy
Úterý 24. 04. 2007 v 22:00

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

Středa 25. 04. 2007 v 05:22

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!

avatar
pixy
Středa 25. 04. 2007 v 09:15

dgx se plete, ten žabák s erekcí jenom dělá stojku.

Středa 25. 04. 2007 v 09:24

A nepomohl by inteligentně nastavený ulimit?

Středa 25. 04. 2007 v 13:52

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 :-)

Středa 25. 04. 2007 v 15:19

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).

avatar
milankowww
Čtvrtek 26. 04. 2007 v 00:03

--- 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/li­nux/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/ker­nel/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:

  1. majme plnokrvny multiprocesor, povedzme s 8 procesormi. Co ak uz sme tesne pred limitom (este jeden proces a bol by limit) a v rovnakom okamihu nam 8 procesov toho isteho cloveka spravi fork()? — ano, podla mna vznikne 7 procesov nad limit.
  2. okrem limitu na procesy existuje limit na pocet vlakien (threadov). Ten je celosystemovy. Da sa nastavovat cez sysctl, standardne ma hodnotu vypocitanu podla velkosti RAM (tak aby len struktury k vlaknam zozrali max pol ramky) a najmenej 20, viz nastavenie max_threads vo funkcii fork_init. Nastavovanie cez sysctl ziadny horny limit nedefinuje. — Takze kto je root, moze zmenit limit nahor a nechat zozrat vsetku pamat jadra forkovanim (ale kto je root, moze si system zhodit milionom inych sposobov, ziadny strach)
avatar
pixy
Čtvrtek 26. 04. 2007 v 00:22

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

Čtvrtek 26. 04. 2007 v 00:32

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. (-;

Čtvrtek 26. 04. 2007 v 22:06

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) .

avatar
Milan
Úterý 4. 09. 2007 v 19:26

Možná by tam mělo být napsaný „pro bashisty“, v ksh to nic neudela.