我的/ 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 $ 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,我有足够的内存。
伙计们,如何删除这些文件?
答案 0 :(得分:4)
您可以让脚本以“块”运行,然后在每个块之间休眠。
在你的第二个版本中,你可以在回声之后添加一个sleep(),比如说30秒。如果你调整删除的文件数量和睡眠时间,它应该保持服务器响应,同时仍然充分执行。
将来,您应该定期从cron运行清理工作,以阻止自己达到这一点。
答案 1 :(得分:3)
如果你可以直接在linux终端上执行命令那么这将变得非常简单,直接执行这个命令
find /tmp -type f -exec rm -v {} \;
另外如果你想定期执行这个过程,那么你可以配置一个cronjob在午夜运行,你的服务器将几乎空闲
答案 2 :(得分:1)
我会以不同的方式解决这个问题:一次性破坏整个文件系统。
创建一个新的文件系统 - 它可能是一个简单的tmpfs
文件系统,它可能是一个ext2或ext3文件系统,它们位于一个环回安装的文件中,它可能是一个新驱动器(USB记忆棒?)什么的。
然后mv
/tmp
挂载指向另一个名称,将新文件系统挂载到/tmp
,然后在分区上运行mke2fs
曾经是/tmp
,并从头开始编写一个全新的干净文件系统。
重新创建旧tmp设备后,您可以再次执行这些步骤 - mv /tmp /new-tmp
,复制应该持久的数据,mount
重新格式化的设备重新开始/tmp,
1}},并复制应该保留的数据。
答案 3 :(得分:0)
exec()
来rm /path/to/clean/*
命令,但速度非常快。
不是很干净,但至少,它对我有用。
答案 4 :(得分:0)
是否需要使用php脚本进行清理?
如果没有,请查看此article ...应该为您提供一些想法
答案 5 :(得分:0)
这可能是删除/ tmp:
下所有文件的更快的标准方法find /tmp -type f -exec rm {} +
Gnu发现,这可能会稍快一些:
find /tmp -type f -delete
如果/ tmp在自己的文件系统上,只需卸载并mkfs即可。如果是tmpfs,只需重启。