我的服务器不断丢失磁盘空间,所以我认为一定有一些我不知道的日志。
有什么好方法可以找到那些大小不断增加的文件?
答案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) { 目录使用情况(); } 别的 { 顶级文件(); }