如何在linux系统中find“增长”的文件

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

find不断增加的文件的好方法是什么?

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

你可以使用这个命令:

find/ – 大小+ 100000k

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

要么

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

看看使用ncdu命令( 这里可用 )给整个系统的目录大小的一个很好的总结视图。 只有几个常用的位置可以在标准系统上检查日志文件,所以这应该很容易监控。 这是发现的好的第一步。

长远来说,你应该做以下的一个…

编写一个脚本来search大于特定大小的文件 。

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


有一个简单的shell脚本,它使用sqlite来存储数据,所以你可以用它来生成varios报告。 只需将其添加到您的crontab: /root/bin/diskhogs.sh /directory/to/monitor

脚本本身就在那里:

 #!/bin/sh # Checking the spool directory SPOOL="/var/spool/diskhogs" if [ ! -e "${SPOOL}" ]; then mkdir -p "${SPOOL}" fi if [ ! -d "${SPOOL}" ]; then echo "There are no ${SPOOL} directory" >&2 exit 1 fi if [ -z "${1}" ]; then DIR=. else DIR="${1}" fi FILES=$(find "${DIR}" -type f) TIME=$(date +%s) if [ -z "${TIME}" ]; then echo "Can't determine current time" >&2 exit 1 fi for FILE in ${FILES}; do SIZE=$(ls -nl ${FILE} | awk '{ print $5 }') if [ -z "${SIZE}" ]; then echo "Can't determine size of the ${FILE} file" >&2 continue fi sqlite3 "${SPOOL}/db" "INSERT INTO sizes VALUES ('${FILE}', '${TIME}', '${SIZE}');" if [ ${?} -ne 0 ]; then continue fi done for PERIOD in 60 300 600 1800 3600 86400; do TIME_WAS=$((${TIME} - ${PERIOD})) ( echo "*** Since $(date --date="@${TIME_WAS}") (${PERIOD} seconds ago) ***" sqlite3 \ "${SPOOL}/db" \ "SELECT MAX(size) - MIN(size) AS mm, name FROM sizes WHERE time >= '${TIME_WAS}' GROUP BY name ORDER BY mm ;" ) > "${SPOOL}/report_${PERIOD}" done 

如果你需要生成更多的自定义报告,你可以使用sqlite:

 sqlite3 /var/spool/diskhogs/db " SELECT MAX(size) - MIN(size) as mm, name FROM sizes WHERE time >= '$(date --date='10 days ago' +%s)' AND name like '/var/lib/libvirt/images/%' GROUP BY name ORDER BY mm DESC ;" 

如果我对如何改进它有一些想法,我将在GitHub上进行更新: https : //gist.github.com/melnik13/7ad33c57aa33742b9854

上面提到ncdu工具是一个非常好的工具,可能是最好的方法。

但是,如果你处于压力之下,只想要一个快速和肮脏的方式来找出发生了什么事情。 从/(root)运行下面的代码

  [root /]# cd / [root /]# du -sm * | sort -nr | head 3755 usr 151 var 109 boot 29 etc [root /]# cd usr [root usr]# du -sm * | sort -nr | head 1618 share 1026 lib64 572 lib 237 bin [root usr]# cd share [root share]# du -sm * | sort -nr | head 415 locale 255 icons 185 help 143 doc [root share]# du -sm * | sort -nr | head 415 locale 255 icons 185 help [root share]# cd locale [root locale]# du -sm * | sort -nr | head 12 uk 12 de [root locale]# 

等等等等来查找和追踪哪些目录和文件占用了太多的空间。

我在几年前的某个地方发现了这个方便的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
 #
 #
 #注意:
强烈build议使用标准的File :: Find Perl模块
 #尝试处理来自深层目录结构的每个文件。 
 #有些人正在写基于Perl的find(1)自己的rutine。 
 #这有时会比File :: Find慢,所以确保你 
 #在现场生产系统中运行它之前,先testing一下。
 #
 #有很多关于File :: Find和它的内存消耗的讨论
 #你怎么能尽量减less。 基本上它非常依赖。 我find
 Solaris 10中的#File :: Find要快得多,目标目录为+ 1mil
 #文件比调用find(1M)的任何自定义perl脚本。
 #
 #你会看到一个内存使用增加,但脚本会更快。 该
 #越深的目录越多的内存将使用。
 #
 #示例:
 #你可以很容易地检查dur如何处理一个大的深层目录,
 #超过+ 1mil文件:
 #
 #用户名大小RSS状态优先时间CPU进程/ NLWP      
 #19667 sparvu 228M 219M睡眠20 0 0:01:36 8.6%dur / 1
 #
 #
 # 也可以看看:
 #http://www.perlmonks.org/?node_id=325146
 #  
 #
 #版权:Copyright(c)2007 Stefan Parvu
 #
 #10-Dec-2006 Stefan Parvu第一版,nawk to perl
 #02-May-2007“”为大文件添加顶层variables
 #13-May-2007“”增加了dir_usage子例程
 #19-May-2007“”添加评论,Perl最佳实践

使用警告;
严格使用
使用File :: Find;
使用Getopt :: Std;
使用Time :: HiRes qw(gettimeofday);


 ###########
 #variables
 ###########
我的%files =();
我的%dirs =();
我的@sorted;
 $ | = 1;
我的$大小= 0;
我的$ mtime = 0;
我的$ current_time = 0;

 ############################
 #处理命令行参数
 ############################
 usage()if(($#ARGV + 1)== 0);
 usage()如果定义$ ARGV [0]和$ ARGV [0] eq“-h”;
 getopts('dT:s:')或usage();
 my $ topN = defined $ 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中使用
 #另见:不适用
 #########################################
子文件数{
     if(-f $ _){
         if($ secs!= 0){
             $ mtime =(stat($ _))[9];
             #if($ mtime $ secs){
                 $ files {$ File :: Find :: name} = -s;
             }
         }
         else {
             $ files {$ File :: Find :: name} = -s;
         }
     }
     $ mtime = 0;
 }




 #########################################
 #用法:find(\&fileCount,@ARGV)
 #目的:统计数字,
 #:字节数
 #返回:标量variables
 #:总字节数
 #参数:
 #评论:从File :: Find中使用 
 #另见:不适用
 #########################################
 sub dirCount {
     if(-f){
         $ size + = -s;
     }
 }

 #########################################
 #用法:dir_usage()
 #用途:报告目录
 #:用法
 #返回:n / a
 #参数:@ARGV
 #评论:调用File :: Find
 #另请参见:dirCount()
 #########################################
 sub dir_usage(){
     my $ target = $ ARGV [0];

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

     opendir(D,$ target)或 
    死(“无法打开$目标阅读:$!\ n”);

     chdir“$ target”;
     foreach(readdir D){
        接下来如果$ _ =〜/^\.\.?$/;
        接下来如果(!-d $ _);
         find(\&dirCount,“$ _”);
         $ dirs {$ _} = $ size;
         $ size = 0;
     }

     closedir(d);

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

 #########################################
 #用法:top_files()
 #目的:打印N个大文件
 #返回:n / a
 #参数:@ARGV
 #评论:调用File :: Find,
 #:默认N = 5
 #另请参见:fileCount()
 #########################################
 sub top_files {

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

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

    find(\&fileCount,@ARGV);

     @sorted = sort {$ files {$ b} $ files {$ a}}键%文件;
     splice @sorted,$ topN if @sorted> $ topN;

 #print标量%文件;

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

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

 #结束时间
     printf“%s%4.2f%s”,“Elapsed:”,$ elapsed,“seconds \ n”;
    打印“处理的文件总数:”。 键(%文件)。  “\ n” 个;
 }


 #########################################
 #用法:usage()
 #目的:打印使用和退出
 #返回:n / a
 #参数:n / a
 #评论:n / a
 #另见:不适用
 #########################################
子使用{
    打印/ opt的STDERR / dev / null#目录用法
     dur -s1200 /#大5以上的大文件
                                  #20分钟/
     dur -s86400 /#前5个大的文件比
                                  #1日/
结束
    出口1;
 }


 ######
 #主要
 ######
 $ current_time = time();

 if($#ARGV> 0){
    用法();
 } elsif($ dirFlag){
     dir_usage();
 } else { 
     top_files();
 }