2012-04-04 6 views
5

私は/ tmpに8百万のファイルがありますので、削除する必要があります。このサーバーもかなり重要なアプリケーションを実行しており、私はそれをオーバーロードできません。大量のファイルを削除する

私は小さな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"; 
    } 
    } 
} 
?> 

をしかし、それもして、私のアプリが到達不能になります: $ ionice -c 3 PHP ./tmp_files_killer.php $素敵-n 20 PHP ./

$ 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"; 
    } 
} 
?> 

が、このスクリプトを実行しているにも遅くなる:それは読み取り/ないように

tmp_files_killer.php私はすべての時間がtmpのディレクトリ私のスクリプトを変更しました私のアプリ。プロセスはCPUをロードせず、十分なメモリがあります。

みんな、これらのファイルを削除するには?

+0

コマンドラインで実行できませんか?一度だけ、または定期的に削除する必要がありますか?おそらく定期的に一定量のファイルを削除するcronジョブを作成するでしょう。 – pritaeas

答えて

0

ギャラリーのアップロードディレクトリをきれいにしたいときにこのようなことをしました。実際には長かったです...だから、exec()のコマンドをrm /path/to/clean/*というように試してみることにしました。

非常にきれいではありませんが、少なくとも、それは私のためにうまくいきました。

3

あなたが直接Linuxターミナルでコマンドを実行できるかどうか、これは非常に簡単なプロセスとなり、直接このコマンドを実行

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

さらにあなたが定期的にこのプロセスを実行したい場合、あなたは、実行するcronジョブを設定することができますあなたのサーバーがほとんどアイドル状態になる深夜12時00分

+0

私はこれを最初に試してみますが、それでもサーバーを叩くかもしれません。 –

+0

これは、名前に '.'がないファイルが見つからないことに注意してください。 – sarnold

+1

..また、 '-exec'は、必要以上に約1000倍以上の 'execve(2)'システムコールを引き起こします。 'find ... -print0 | xargs -0 rm'は 'rm'をかなり少ない頻度で実行します。そして出力( '-v')は、プログラムの最も遅い部分であるIOが不要になるだけです... – sarnold

0

PHPスクリプトを使用してクリーンアップを行う必要はありますか?

ない場合は、あなたがスクリプトは、各チャンクの間で寝た後、「チャンク」で動作するように得ることができるいくつかのアイデア

4

を取得する必要があり、...このarticleを見てみましょう。

2番目のバージョンでは、echo(30秒)後にsleep()を追加することができます。削除されたファイルの数と時間がスリープ状態になっている場合は、適切に処理している間にサーバを応答し続ける必要があります。

将来、cronから定期的にクリーンアップジョブを実行して、この時点までの作業をやめてください。

1

私はこれを別の方法で解決します。ファイルシステム全体を一気に破壊します。

単純なtmpfsファイルシステム、ループバックマウントされたファイルに存在するext2またはext3ファイルシステム、新しいドライブ(USBメモリスティック)などの新しいファイルシステムを作成します。

その後mv/tmpは、別の名前にマウントポイントを/tmpに新しいファイルシステムをマウントし、その後/tmpこと、およびゼロから全く新しいクリーンなファイルシステムを記述するために使用さパーティションmke2fsを実行します。

古い-tmpのデバイスが再作成されたら、もう一度手順を実行することができます - mv /tmp /new-tmp、永続的である必要があり、データをオフにコピーし、mount再フォーマットされたデバイスバック/tmp,上、及びそのはずのデータをコピーバック存続する。

0

これはおそらく、/ tmpの下のすべてのファイルを削除するより速く、まだ標準的な方法です:ヌーは見つけると

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

、これはわずかに速いかもしれません:

find /tmp -type f -delete 

場合は/ tmpが上にあり、その自身のファイルシステムをマウント解除し、mkfsだけを実行します。それがtmpfsならば、リブートするだけです。

関連する問題