如何在 Linux 系统内找到“增长”的文件

如何在 Linux 系统内找到“增长”的文件

我的服务器不断丢失磁盘空间,所以我认为一定有一些我不知道的日志。

有什么好方法可以找到那些大小不断增加的文件?

答案1

有一个名为 gt5 的实用程序可以显示当前目录大小以及与上次检查的差异。

答案2

你可以使用这个命令:

查找/-大小+100000k

这将返回所有空间超过 100 兆字节的文件。您可以根据需要减少或增加大小的值。

或者

您可以使用名为“ncdu”的实用程序,它会自动创建文件/文件夹大小的 MAP。

答案3

使用命令查看ncdu可在此处获得) 提供整个系统的目录大小的良好摘要视图。在标准系统中,只有几个常见位置可以检查日志文件,因此这应该很容易监控。这是发现的良好第一步。

从长远来看,您应该执行以下操作之一...

编写脚本来搜索大于特定大小的文件

然而,最好的方法可能是日志维护和轮换。

答案4

几年前我在某个地方发现了这个方便的 perl 脚本,从那时起就一直在使用它。每次都很好用 :-) 作者列在顶部,我不承担任何责任。

/usr/bin/perl 的 #!
#
# dur – 磁盘|目录使用情况报告器
# Perl 实用程序检查磁盘空间利用率
#
# 该实用程序显示磁盘使用情况:
#-文件总数
#-最大型文件
# - 额外信息:老化文件、目录
#
# 使用方法:dur [-d] [-Tn] 目录
# 例如,dur /usr # /usr 的前 5 个大文件
# dur -T5 /opt # /opt 的前 5 个大文件
# dur -T10 / # 前 10 个大文件 /
# dur -d /opt # /opt 目录使用情况
#
#
# 注意:
# 强烈建议使用标准 File::Find Perl 模块
# 当尝试处理深层目录结构中的每个文件时。
# 有些人正在根据 Perl 中的 find(1) 编写自己的程序。
# 这有时会比 File::Find 慢,所以请确保
# 在实时生产系统中运行之前请先进行测试。
#
# 关于 File::Find 及其内存消耗的讨论很多,
# 如何才能最小化这种情况。基本上这很大程度上取决于情况。我发现
# File::Find 在 Solaris 10 中速度更快,目标目录为 +1mil
# 文件数比任何调用 find(1M) 的自定义 perl 脚本都要多。
#
# 您将看到内存使用量增加,但脚本将运行得更快。
# 目录越深,占用的内存就越多。
#
# 例子:
# 你可以很容易地检查 dur 在一个大而深的目录中是如何工作的,
# 超过 100 万个文件:
#
# PID 用户名 大小 RSS 状态 优先级 时间 CPU 进程/NLWP      
# 19667 sparvu 228M 219M 睡眠 20 0 0:01:36 8.6% dur/1
#
#
# 也可以看看:
#http://www.perlmonks.org/?node_id=325146
#  
#
# 版权:版权所有 (c) 2007 Stefan Parvu
#
# 2006 年 12 月 10 日 Stefan Parvu 第一版,从 nawk 到 perl
# 02-May-2007 “” 为大文件添加了 top 变量
# 2007 年 5 月 13 日“”添加了 dir_usage 子程序
# 2007 年 5 月 19 日“”添加评论,Perl 最佳实践

使用警告;
使用严格;
使用文件::查找;
使用 Getopt::Std;
使用 Time::HiRes qw(gettimeofday);


##########
# 变量
##########
我的 %文件 = ();
我的%dirs =();
我的@sorted;
$|=1;
我的$size = 0;
我的$mtime = 0;
我的$current_time = 0;

############################
# 处理命令行参数
############################
使用情况(如果(($#ARGV+1)==0);
usage() 如果定义了 $ARGV[0] 并且 $ARGV[0] eq "-h";
getopts('dT:s:') 或 usage();
我的 $topN = 定义 $main::opt_T ?$main::opt_T : 5;
我的 $dirFlag = 定义 $main::opt_d ? $main::opt_d : 0;
我的 $secs = 定义 $main::opt_s ? $main::opt_s : 0;


###############################################
# 用法:find(\&fileCount,@ARGV)
# 目的:计数,
# :每个文件的字节数
# 返回:包含所有文件的哈希值
# 参数 :
# 注释:来自 File::Find
# 另请参阅:n/a
###############################################
子文件数 {
    如果(-f $ _){
        如果 ($secs != 0) {
            $mtime = (stat($_))[9];
            #如果 ($mtime $secs) {
                $files{$File::Find::name} = -s;
            }
        }
        别的 {
            $files{$File::Find::name} = -s;
        }
    }
    $mtime = 0;
}




###############################################
# 用法:find(\&fileCount,@ARGV)
# 目的:计数,
# :字节数
# 返回:标量变量,
# :总字节数
# 参数 :
# 注释:来自 File::Find
# 另请参阅:n/a
###############################################
子目录计数 {
    如果(-f){
        $大小+=-s;
    }
}

###############################################
# 用法:dir_usage()
# 目的:报告目录
# : 用法
# 退货:无
# 参数:@ARGV
# 注释:调用 File::Find
# 另请参阅:dirCount()
###############################################
子目录使用情况(){
    我的 $target = $ARGV[0];

    打印“处理目录...\n”;

    opendir(D,$target) 或
    die("无法打开$target进行读取:$!\n");

    chdir“$目标”;
    foreach (readdir D) {
        接下来如果 $_ =~ /^\.\.?$/;
        下一步如果(!-d $_);
        查找(\&dirCount,“$_”);
        $dirs{$_} = $size;
        $大小 = 0;
    }

    关闭目录(D);

    @sorted = 排序 {$dirs{$b} $dirs{$a}} 键 %dirs;
    foreach (@sorted) {
        printf "%6d MB => %s\n",$dirs{$_}/1048576,$_;
    }
    打印“处理的目录总数:”。keys(%dirs)。“\n”;
}

###############################################
# 用法:top_files()
# 目的:打印前 N 个大文件
# 退货:无
# 参数:@ARGV
# 注释:调用 File::Find,
# :默认 N=5
# 另请参阅:fileCount()
###############################################
子顶级文件{

    打印“处理前$topN个大文件...\n”;

#从这里开始计数
    我的 $tstart = gettimeofday();

    查找(\&fileCount,@ARGV);

    @sorted = 排序 {$files{$b} $files{$a}} 键 %files;
    如果@sorted > $topN,则拼接@sorted, $topN;

#打印标量%files;

    foreach (@sorted) {
        printf "%6d MB => %s\n", $files{$_}/1048576, $_;
    }

    我的 $tend = gettimeofday();
    我的 $elapsed = $tend - $tstart;

#结束计时
    printf "%s%4.2f%s", "已用时间:", $elapsed, "秒数\n";
    打印“处理的文件总数:”。keys(%files)。“\n”;
}


###############################################
# 用法:usage()
#目的:打印使用情况并退出
# 退货:无
# 参数 :无
# 评论 : 无
# 另请参阅:n/a
###############################################
子用法 {
    打印 STDERR /dev/null #/opt 的目录使用情况
    dur -s1200 / # 前 5 个大文件早于
                                 # 20 分钟 /
    dur -s86400 / # 前 5 个大文件早于
                                 # 1 天 /
结尾
    1号出口;
}


######
# 主要的
######
$当前时间 = 时间();

如果 ($#ARGV > 0) {
    用法();
} elsif ($dirFlag) {
    目录使用情况();
} 别的 {
    顶级文件();
}

相关内容