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

但这使我的应用程序无法访问,即使使用: $ ionice -c 3 php ./tmp_files_killer.php $ nice -n 20 php ./tmp_files_killer.php

我已经更改了我的脚本,所以它不会一直读取 /tmp 目录:

$ 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

您可以让脚本在“块”中运行,然后在每个块之间休眠。

在您的第二个版本中,您可以在回声之后添加一个 sleep(),比如 30 秒。如果您调整已删除文件的数量和休眠时间,它应该保持服务器响应,同时仍能充分执行。

将来,您应该定期从 cron 运行清理作业,以阻止自己到达这一点。

于 2012-04-04T10:01:00.553 回答
3

如果你可以直接在linux终端上执行命令那么这将变得非常简单,直接执行这个命令

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

此外,如果您想定期执行此过程,那么您可以配置一个 cronjob 在午夜运行,此时您的服务器几乎处于空闲状态

于 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 回答