5

/tmp に 800 万個のファイルがあり、それらを削除する必要があります。このサーバーはかなり重要なアプリも実行しており、過負荷にすることはできません。

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

ただし、次の場合でも、アプリに到達できなくなります。

スクリプトを変更して、常に /tmp dir を読み取らないようにしました。

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

しかし、このスクリプトを実行すると、アプリの速度も低下します。プロセスが CPU に負荷をかけず、十分なメモリがあります。

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

4

6 に答える 6

4

スクリプトを「チャンク」で動作させ、各チャンク間でスリープさせることができます。

2 番目のバージョンでは、エコーの後に sleep() を追加できます (たとえば 30 秒)。削除するファイルの数とスリープ時間を調整すると、適切に実行しながらサーバーの応答性を維持する必要があります。

今後は、cron から定期的にクリーンアップ ジョブを実行して、この時点に到達しないようにする必要があります。

于 2012-04-04T10:01:00.553 に答える
3

Linuxターミナルでコマンドを直接実行できる場合、これは非常に簡単なプロセスになり、このコマンドを直接実行します

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

さらに、このプロセスを定期的に実行する場合は、サーバーがほとんどアイドル状態になる真夜中に実行するように cron ジョブを構成できます。

于 2012-04-04T09:58:23.207 に答える
1

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

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

次にmv/tmpマウント ポイントを別の名前に変更し、新しいファイル システムを にマウントしてから、以前は だったパーティション/tmpで実行mke2fsし、まったく新しいクリーンなファイル システムを最初から書き込みます。/tmp

古い tmp デバイスが再作成されたら、手順を再度実行できます。mv /tmp /new-tmp永続化する必要があるデータをコピーしmount、再フォーマットされたデバイスをオン/tmp,に戻し、永続化する必要があるデータをコピーして戻します。

于 2012-04-04T10:01:04.173 に答える
0

これはおそらく、/tmpの下にあるすべてのファイルを削除するためのより高速で標準的な方法です。

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

Gnu findを使用すると、これは少し速くなる可能性があります。

find /tmp -type f -delete

/ tmpが独自のファイルシステム上にある場合は、マウントを解除してmkfsするだけです。tmpfsの場合は、再起動するだけです。

于 2012-04-09T15:22:01.263 に答える
0

ギャラリーのアップロードディレクトリをきれいにしたいときに、この種のことをしました。exec() 本当に長かったです... それで、コマンドでコマンドを好きにしてみることにしましたrm /path/to/clean/*。それは本当に速くなりました。

あまりきれいではありませんが、少なくとも私にとってはうまくいきました。

于 2012-04-04T09:57:28.070 に答える
0

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

そうでない場合は、この記事をご覧ください...いくつかのアイデアが得られるはずです

于 2012-04-04T10:00:49.653 に答える