2012-04-04 17 views
5

Mam 8 milionów plików w mojej/tmp i muszę je usunąć. Na tym serwerze działa również bardzo ważna aplikacja i nie mogę jej przeciążać.Usuwanie ogromnej ilości plików

używam mały skrypt PHP:

<?php 
$dir = "/tmp"; 
$dh = opendir($dir); 
$i = 0; 
while (($file = readdir($dh)) !== false) { 
    $file = "$dir/$file"; 
    if (is_file($file) && (preg_match("/open/", $file))) { 
    unlink($file); 
    #echo $file; 
    if (!(++$i % 10000)) { 
     echo "$i files removed\n"; 
    } 
    } 
} 
?> 

ale to sprawia, że ​​moja aplikacja nieosiągalny, nawet z: $ ionice C3 php ./tmp_files_killer.php $ miły -n 20 php ./ tmp_files_killer.php

zmieniłem mój skrypt tak, że nie będzie czytać/tmp reż cały czas:

$ ls -1 /tmp > tmp_files_list.txt 

<?php 
$file = "tmp_files_list.txt"; 
$infile = fopen($file, "r"); 

while (!feof($infile)) { 
    $line = rtrim(fgets($infile), "\n\r"); 
    if ($line != null){ 
    $file = "$dir/$line"; 
    unlink($file); 
    if (!(++$i % 10000)) { 
     echo "$i files removed\n"; 
    } 
# echo $line + "\n"; 
    } 
} 
?> 

ale działa ten skrypt również spowalnia moja aplikacja. Proces nie ładuje procesora i mam dość pamięci.

Faceci, jak usunąć te pliki?

+0

Nie możesz tego zrobić w wierszu poleceń? Czy musisz je usuwać tylko raz lub w regularnych odstępach czasu? Być może tworzenie cronjob, który usuwa stałą liczbę plików w regularnych odstępach czasu. – pritaeas

Odpowiedz

0

Zrobiłem tego rodzaju rzeczy, gdy chciałem wyczyścić katalog do przesłania do galerii. To było naprawdę długie ... Więc zdecydowałem się spróbować exec() jak polecenia z poleceniem rm /path/to/clean/* i zrobiło się naprawdę szybko.

Niezbyt czyste, ale przynajmniej zadziałało dobrze.

3

czy można bezpośrednio wykonywać polecenia na terminalu linux wtedy to staje się bardzo łatwy proces, bezpośrednio wykonać tę komendę

find /tmp -type f -exec rm -v {} \; 

dodatkowo jeśli chcesz przeprowadzić ten proces okresowo następnie można skonfigurować cron do uruchomienia o północy, kiedy serwer będzie prawie bezczynny.

+0

Spróbowałbym też tego najpierw - ale nadal może uderzać w serwer. –

+0

Należy zauważyć, że spowoduje to pominięcie plików, które nie mają nazwy "." W nazwie. – sarnold

+1

.. Ponadto '-exec' spowoduje około tysiąckroć lub więcej wywołań systemowych 'execve (2)', niż jest to konieczne. 'znajdź ... -print0 | xargs -0 rm "wykonałoby' rm' znacznie rzadziej. A wynik ('-v') po prostu spowoduje niepotrzebne IO, które jest często najwolniejszą częścią programów ... – sarnold

0

Czy istnieje potrzeba oczyszczenia za pomocą skryptu php?

Jeśli nie, spójrz na tego article ... powinno Ci kilka pomysłów

4

można uzyskać skrypt do pracy w „kawałki”, a potem spać między każdym fragmencie.

W drugiej wersji można dodać funkcję sleep() po echo, powiedzmy 30 sekund. Jeśli dostroisz liczbę usuniętych plików i czas snu, serwer powinien pozostać responsywny, a jednocześnie nadal działać poprawnie.

W przyszłości należy regularnie uruchamiać zadanie czyszczenia z crona, aby powstrzymać się od dotarcia do tego punktu.

1

Rozwiązałbym to w inny sposób: za jednym zamachem zniszcz cały system plików.

Utwórz nowy system plików - może to być prosty system plików tmpfs, może to być system plików ext2 lub ext3, który znajduje się w pliku z zamontowanym sprzężeniem zwrotnym, może to być nowy dysk (pamięć USB?), Cokolwiek.

Następnie mv/tmp punkt podłączenia do innej nazwy, zamontować nowy system plików na /tmp, a następnie uruchomić mke2fs na partycji że kiedyś /tmp i napisać zupełnie nowy czysty system plików od podstaw.

Gdy urządzenie starego tmp jest ponownie tworzone, można ponownie wykonać kroki - mv /tmp /new-tmp, skopiuj się dane, które powinny być trwałe, mount urządzenie ponownie formatowane powrotem na /tmp, i skopiować z powrotem dane, które powinny trwać.

0

Jest to prawdopodobnie jeszcze szybciej standardowy sposób, aby usunąć wszystkie pliki w katalogu/tmp:

find /tmp -type f -exec rm {} + 

GNU znaleźć, to może być nieco szybciej:

find /tmp -type f -delete 

Jeśli/tmp jest na własny system plików, po prostu odmontuj i mkfs to. Jeśli jest to tmpfs, po prostu uruchom ponownie.

Powiązane problemy