我有一个服务器不断地丢失磁盘空间,所以我认为必须有一些我不知道的日志。
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();
}