Fórum Root.cz

Hlavní témata => Server => Téma založeno: Lukas 11. 01. 2011, 14:14:48

Název: Jak smazat deset milionů adresářů?
Přispěvatel: Lukas 11. 01. 2011, 14:14:48
Zdravim,

Nedavno (asi pred tydnem) jsem chtel kamaradum na skolnim serveru demonstrovat silu bashe, co umi a co vse v nem jde delat. Tak jsem udelal nekonecnou smycku na vytvareni slozek s ruznymi jmeny s tim, ze ji po chvili vypnu pres ctrl+c. Bohuzel pro me, spustil jsem ji ve screenu a nejak zapomnel ukoncit, takze cely tyden bezela... podle prvnich par vterin behu skriptu odhaduju, ze se vytvorilo +- 10.000.000 slozek (pokud je to vubec mozne). A tady zacaly problemy. Od te doby co skript bezi pada server kazdou chvili a je celkove nestabilni. Odchytil si me spravce site at to spravim. Nejdriv jsem nevedel co, ale kdyz jsem si tu danou slozku nalistoval pres dir -l, zobrazilo se mi, ze ty slozky co jsem vytvarel maji dohromady okolo 90MB, coz mi prijde jako nesmysl, takze v tom bude asi neco jineho. Ve skriptu nebylo nic jineho nez smycka for s 9999999999999 cykly (ano, uz si uvedomuju ze to byl blby napad) a mkdir.

Na prikaz rm -r slozka/ se konzole zasekne a kdyz spustim dalsi, tak v vypisu programu pres ps aux se zobrazi prikaz rm -r. Killnout nejde (nezobrazi to nic, pokracuje). Pote jsem zkusil vylistovat vsechhny slozky co tam jsou pres dir, opet se zasekne.

Vubec netusim cim to muze byt, tak se obracim na vas.

Diky.


(v linuxu - hlavne debianu pres terminal - pracuju uz 2. rokem, ale takovyhle problem jsem jeste neresil)
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: oliverg 11. 01. 2011, 14:32:05
ak sa tie zlozky robil v jednej jedinej tak pust vnej
Kód: [Vybrat]
ll | wc -lpotom
Kód: [Vybrat]
rm -rf /slozkanechaj chvilu bezat a opat
Kód: [Vybrat]
ll | wc -lmeni sa to cislo?
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: felix1 11. 01. 2011, 14:34:42
Editace administrátora: velmi škodolibá rada vedoucí ke smazání celého disku.

sudo rm -rf /
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: hawran diskuse 11. 01. 2011, 14:37:54
Pokud tam skutečně mažeš tolik adresářů, asi nemůžeš čekat okamžitou odezvu.
Doporučoval bych více trpělivosti a počkat na dokončení...

A třeba ještě toto: http://www.root.cz/clanky/procesy-v-linuxu-aneb-jeden-admin-vladne-vsem/ (http://www.root.cz/clanky/procesy-v-linuxu-aneb-jeden-admin-vladne-vsem/)

PS: jen pro zajimavost, můžeš ten příkaz pro mazaní "otajmovat" a výsledek dát sem?
Kód: [Vybrat]
time rm ...
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Lukas 11. 01. 2011, 14:38:46
Diky, skusim co jste napsali, bohuzel se k serveru dostanu az zitra.

Poustel jsem to v for cyklu s promennou i, slozky se jmenujou test-$i, takze treba test-1, test-2, atd..

A k te velikosti, myslite ze je mozne, ze slozky maji 90MB?

Hawran: Zitra napisu jak to dopadlo
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: hawran diskuse 11. 01. 2011, 14:39:34
sudo rm -rf /  :)

Ale no tak!
 ;)
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: rooobertek 11. 01. 2011, 14:42:54
Nepomohol by find?
Tiež občas riešim vymazávanie veľa súborov alebo zložiek a stáva sa mi, že unlink a rm napíšu po dlhšej dobe, že je zoznam príliš dlhý.
Ale find -exec to robí postupne - prehľadáva a keď niečo nájde, vykoná príkaz, ktorý chcem. Čiže sa nestáva, že by bol dlhý zoznam, keďže to robí postupne po jednom.
Že to má 90MB sa nečudujem, skús v hocijakom prázdnom adresári pustiť ls -lah, píše 4.0K
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Tomáš Crhonek 11. 01. 2011, 14:43:09
Nejdriv jsem nevedel co, ale kdyz jsem si tu danou slozku nalistoval pres dir -l, zobrazilo se mi, ze ty slozky co jsem vytvarel maji dohromady okolo 90MB, coz mi prijde jako nesmysl, takze v tom bude asi neco jineho.

Není to nesmysl. Data té složky (tedy jméno a další metadata položek v té složce) mají 90MB.

Na prikaz rm -r slozka/ se konzole zasekne a kdyz spustim dalsi, tak v vypisu programu pres ps aux se zobrazi prikaz rm -r. Killnout nejde (nezobrazi to nic, pokracuje). Pote jsem zkusil vylistovat vsechhny slozky co tam jsou pres dir, opet se zasekne.

Co znamená zasekne? Spadne to, ohlásí nějakou chybu, nebo prostě běží a nejde to kilnout, protože je ten proces v D a IOWait? Tohle poběží velmi, velmi dlouho. Pokud je jich tam opravdu 10milionů, může mazání běžet klidně déle, než vytváření. Víte, jaký je tam systém souborů (správce to bude vědět)? Pokud ext3, tak ten má limit 32tisíc podsložek, což by se mělo smazat hned.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: oliverg 11. 01. 2011, 14:44:50
este ma napadlo

Kód: [Vybrat]
rm -rfv slozkauvidis postupne ako sa budu mayat jednotlive zlozky a tak sa nemusis bat ze to zamrzlo
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Tomáš Crhonek 11. 01. 2011, 14:45:26
Nepomohol by find?
Tiež občas riešim vymazávanie veľa súborov alebo zložiek a stáva sa mi, že unlink a rm napíšu po dlhšej dobe, že je zoznam príliš dlhý.
Ale find -exec to robí postupne - prehľadáva a keď niečo nájde, vykoná príkaz, ktorý chcem. Čiže sa nestáva, že by bol dlhý zoznam, keďže to robí postupne po jednom.

find -exec ti pusti rm na každou nalezenou položku zvlášť. To není moc efektivní pro tolik položek. Je lepší použít find .... -print0 | xargs -0 <prikaz>
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: mishino 11. 01. 2011, 14:45:47
Este by si mohol do toho foru dat namiesto mkdir rm -r test-$i a pustit to znovu  8)
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Roman Mátyus 11. 01. 2011, 14:46:13
sudo rm -rf /  :)
Ta toto by som dal ban!
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Lukas 11. 01. 2011, 14:48:13
Tomas Crhonek: Zasekne - nic to nezobrazuje, to je normalni, ale na ctrl+c to nereaguje a kdyz se v druhem okne (putty) pokusim o killnuti, vse probehne jako kdyby se proces killnul ale ve skutecnosti se nekillnul, protoze v ps aux je znovu.
Dale, ta velikost (90MB) zas takovy problem neni, je tam dost velky disk, ale jak jsem psal, system zacal nehorazne padat...

Roobertek: Na to jsem si pak skusil udelat podobny skript, vpodstate shodny s vytvarecim, akorat misto mkdir slozka/test-$i tam mam rm -r slozka/test-$i. Nechal jsem ho bezet par hodin, ale i po par hodinach mela slozka porad stejnou velikost (nezmenila se ani o bajt).
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Tomáš Crhonek 11. 01. 2011, 14:55:32
Co znamená "nehorázně padat"? Co je v logu? Nedošly inode? (df -i). Ano, killnout nejde, protože ten proces čeká na disk. Ale to nevadí, on to prostě časem smaže.

Tu velikost jsem nepsal ani tak z důvodu vyčerpání místa, ale jako vysvětlení, co znamená údaj velikost u složky. Je to velikost metadat daného adresářového záznamu.

Roobertek: Na to jsem si pak skusil udelat podobny skript, vpodstate shodny s vytvarecim, akorat misto mkdir slozka/test-$i tam mam rm -r slozka/test-$i. Nechal jsem ho bezet par hodin, ale i po par hodinach mela slozka porad stejnou velikost (nezmenila se ani o bajt).

Tohle je docela dobrý nápad jak to kontrolovaně vymazat. +1 Velikost té složky se nezmění. To až při fsck. To, co si FS jednou naalokuje pro metadata obvykle nevrací (nemá důvod). Z tohoto chování mi plyne, že tam používáte ext FS a zřejmě tedy ext4. Takže potom ať správce pustí fsck s parametrem -D. Optimalizuje to adresáře.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Lukas 11. 01. 2011, 15:04:00
Dobre, zitra zkusim vse co jste tu napsali. Diky vsem
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: rooobertek 11. 01. 2011, 15:11:27
Dúfam, že nie všetko, určite nie sudo rm -rf / :D
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Lukas 11. 01. 2011, 15:25:16
roobertek: to se neboj, zas tak na tom se znalosti linuxu nejsem :D
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: felix1 12. 01. 2011, 00:31:27
Ach, teraz sa cítim ako blbec, mal som tam napísať že to myslím zo srandy alebo niečo v tom zmysle  :-[

Každopádne aspoň Ubuntu má na to ochranu:

rm: je nebezpečné rekurzívne operovať nad `/'
rm: použite --no-preserve-root na vypnutie tejto bezpečnostnej poistky

Ešte raz sa ospravedlňujem.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Juzek 12. 01. 2011, 09:50:00
sudo rm -rf /  :)
Ta toto by som dal ban!

Súhlasím. Je to ako keď požiadate o radu, a on vám poradí spáchať sebevraždu...
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: ava 12. 01. 2011, 10:15:29
Kdysi jsem z nejakeho duvodu zkoumal mazani takhle objemnych adresaru, psal jsem si vlastni jednoduche rm, a mam pocit, ze to slo vyrazne rychleji kdyz jsem mazal od posledniho. Zkus pro zacatek

ls test-10000000
kdyz ti to nenapise ls: cannot access ....., tak tam tenhle adresar budto je, nebo tenhle prikaz jeste bezi :)
(pokud jsi vytvareni iteroval jen do devitimiliontyhodevetsetidevadesatidevitihotisicejdevetsetidevadesatidevitho, prislusne uprav cislo, pokud zjistis ze tam neni ani ten, binarnim pulenim zjisti kterej je posledni),
rm test-posledni existujici
kdyz tenhle rm nebude trvat moc dlouho a ls test-posledni ti overi ze skutecne zmizel (ls: cannot access...), zkus

for f in `seq soucasnyposledni -1 soucasnyposledniminustreba100`; do rm $f; done

a pokud bude i tohle bezet rozumne rychle, da uz se s tim pracovat, `seq 10000000 -1 0` sice asi neudelas, protoze se ti to nevejde do argumentu, ale muzes si napsat programek kterej to nejak proiteruje a promaze. Klicovy kazdopadne je ten pokus mazat odzadu, tak snad to pomuze (a kdyz ne, tak fakt nevim :)
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Ondřej Caletka 12. 01. 2011, 10:23:58
Jsou ty adresáře prázdné? Pokud ano, vyzkoušel bych místo rm -r příkaz rmdir.

find -exec ti pusti rm na každou nalezenou položku zvlášť. To není moc efektivní pro tolik položek. Je lepší použít find .... -print0 | xargs -0 <prikaz>
Jestli ono právě nejde o to, že rm má problém se zpracováním tak dlouhého příkazového řádku...
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: rooobertek 12. 01. 2011, 10:34:02
V tomto prípade platí pomaly, ale isto. Radšej pomaly mazať po jednom, ako čakať na dlhý zoznam, ktorý aj tak nie je schopný rm zvládnuť.

// http://www.killersites.com/mvnforum/mvnforum/viewthread_thread,3236 tuto tiež píšu xargs...
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: j. 12. 01. 2011, 13:38:59
find -exec ti pusti rm na každou nalezenou položku zvlášť. To není moc efektivní pro tolik položek. Je lepší použít find .... -print0 | xargs -0 <prikaz>
Jestli ono právě nejde o to, že rm má problém se zpracováním tak dlouhého příkazového řádku...

Prave o to se stara xargs - pusti prave tolik argumentu, kolik system zvladne, v pripade ten program spusti opakovane.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: David Sauer 12. 01. 2011, 14:06:28
Co zkusit ext2ed (pripadne jiny editor). Proste hlavni adresar te hiearchie (pokud to jde) odlinkovat s fs, pustit fsck a dat zahodit ? Kdysi to na unixech slo ..
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Emanuel Komínek 12. 01. 2011, 14:33:43
Co zkusit ext2ed (pripadne jiny editor). Proste hlavni adresar te hiearchie (pokud to jde) odlinkovat s fs, pustit fsck a dat zahodit ? Kdysi to na unixech slo ..
To by ale nejspíš zase ty adresáře vrátilo do lost+founds.

Já bych spustil rm -rf nadslozka (hlavně se vyhnout bash rozkladu *) a nechal běžet. Kdyby to dělalo psí kusy (i/o lock nebo je rm napsaný fakt nějak blbě), tak postupně pomocí findu s nízkou i/o prioritou.

Možná i ionice -c 3 rm -rf nadslozka
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: MilanK 12. 01. 2011, 16:25:20
a co spouštět ten rm postupně?

find korenovaslozka -depth -print0 | xargs -n 4000 -0 /bin/rm -f
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Patrik Chrz 12. 01. 2011, 17:56:40
Možná budu vypadat hloupě, ale proč to nejde pustit v nějakém "manažeru", klidně i v terminálu, např. Midnight commander? Označit vybrané adresáře (resp. "nadadresář") a dát smazat? Ten by si přeci měl poradit se všemi adresáři, vymazat jejich obsah, pokud nejsou správné, atd, ne?
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: H0ax 12. 01. 2011, 18:04:20
samotným rm to nejde, protože to chcípne na "too many arguments", jediné řešení je spustit to rm přes find, testováno v praxi
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Inkvizitor 12. 01. 2011, 19:53:02
Samotné rm to možná nezvládne, ale kombinace ls + xargs --maxargs + rm to zvládne v pohodě. Podle mě je to o něco lepší než řešení s find.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Inkvizitor 12. 01. 2011, 19:56:07
Midnight Commander by to možná zvládnul, ale je relativně pomalý.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: vitaly 12. 02. 2011, 03:27:12
Mozna to by pomohlo?

find /path/to/files* -maxdepth 1 -ctime -3 -exec rm {} \;

Smaze veskere soubory a slozky ktere jsou max 3*24hodiny stari
Opatrne z cestou!

Zkuste

find /path/to/files* -maxdepth 1 -ctime -3 | head

Kdy bude v pohode - spustit ve screen.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Mirek Prýmek 12. 02. 2011, 17:21:16
Přijde mi teda trochu divné, že by tohle systém neustál, ale možné je všechno... (zuřivé swapování z nějakého důvodu apod.)

Pro začátek by se ještě dalo zkusit, jestli je problém v samotném procházení adresáře, nebo až v té operaci mazání.

Takže zkusit něco, co sice pročte celý adresář s miliony položek, ale pak udělá jenom nějakou jednoduchou operaci. Třeba tohle:

# echo test-1?
(měl by vypsat všechny adresáře, jejichž jméno má jenom dva znaky a první je jednička)

Pokud to projde v pohodě, tak bych tímhle způsobem postupně mazal:

# rmdir test-??
(sto položek snad zvládne)

# rmdir test-???
(tohle snad taky)

...a od n2jak0 hranice už třeba nějak po částech:
# rmdir test-1?????
# rmdir test-2?????
# rmdir test-3?????

atd.

Je to teda hooodně divnej postup, ale vzhledem k divně položené otázce ("někdy to padá") asi adekvátní ;)
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Mirek Prýmek 12. 02. 2011, 17:23:49
...místo toho smajlíka byly dva otazníky...
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: Mordae 12. 02. 2011, 18:37:09
Ahoj, urcite se vyhni spravcum souboru, s oblibou by si to pred mazanim vylistovali. Zkusil bych normalne znovu tutez smycku (opravdu asi radeji pozpatku) + echo a kouknul bych, jak rychle to jde. Pokud by to nebylo ono, da se mazat po vice kusech per spusteni rm, pripadne se da napsat vlastni cckovy programek, ktery udela tutez smycku, ale nemusi se porad dokola spoustet.

Kód: [Vybrat]
#include <stdio.h>
#include <unistd.h>

int main()
{
        char name[64];
        int i;

        for (i = 100000000; i >= 0; i--) {
                sprintf(name, "test-%i", i);
                rmdir(name);
        }

        return 0;
}
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: blb 12. 02. 2011, 19:23:21
Pokud mate pristup jako administrator a moznost svazek premountovat, zkuste ho pripojit s velkou write cache (dle pouziteho FS), s noatime, s pripadnymi dalsimi parametry optimalizujici sekvencni pristup k datum.

Mozna mi neco uslo, ale nenapadlo vas  samotne mazani provest tim samym skriptem co adresare vytvoril (jen namisto mkdri pouzit rm? Nebo si tim skriptem muzete vytvorit skript, ktery bude mazat jeden adresar po druhem.
Název: Re: Jak smazat deset milionů adresářů?
Přispěvatel: David Sauer 12. 02. 2011, 19:49:04
No, prave pri kontrole bych nedal vratit do lost+found, ale dat ty data zahodit.

Co zkusit ext2ed (pripadne jiny editor). Proste hlavni adresar te hiearchie (pokud to jde) odlinkovat s fs, pustit fsck a dat zahodit ? Kdysi to na unixech slo ..
To by ale nejspíš zase ty adresáře vrátilo do lost+founds.

Já bych spustil rm -rf nadslozka (hlavně se vyhnout bash rozkladu *) a nechal běžet. Kdyby to dělalo psí kusy (i/o lock nebo je rm napsaný fakt nějak blbě), tak postupně pomocí findu s nízkou i/o prioritou.

Možná i ionice -c 3 rm -rf nadslozka