Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2501196
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: 系统运维

2013-12-03 13:38:06

    因服务器上的程序,集团下发版本时,都不知道是什么时候下发的。有时候会将自己写的程序,给覆盖掉。因此领导要求,做一个监控程序,当目录下的文件发生变化时,将变化的文件名称,大小,修改日期,路径记录下来。方便开发人员维护。
    接到这个任务,很快想到,使用ls -l找到文件当前的大小,日期。和原来的进行比对。如果当前的时间比原来的时间大,则进行记录。比对文件,想到了用awk,在这里说一下awk确实是个好东西哦,功能强大。我也只是知道使用awk可以处理这个问题。看着网上别人写的代码,慢慢的改造,终于完成了第一版的shell脚本,实现文件比对。虽然不完成,可是实现了核心的功能。核心shell脚本代码如下:

点击(此处)折叠或打开

  1. #!/bin/sh

  2. # 程序描述:对指定目录下的文件,进行监控,当发现文件更新变化时,
  3. # 提取发生变化的文件信息。
  4. # 作者:程晓鹏
  5. # 时间:2013.11.29

  6. #要进行监控的目录路径
  7. FC_HOME=/ngbss/otherapp/pengtest/CRBT

  8. #集团下发版本,所在的路径
  9. FC_UPDATE_HOME=/ngbss/otherapp/pengtest/CRBT

  10. #监控程序所在的目录
  11. FC_SOURCE_HOME=/ngbss/otherapp/pengtest

  12. #监控程序处理结果备份目录
  13. FC_RESULT_HOME=/ngbss/otherapp/pengtest/result

  14. #主机IP,登陆的用户名,检测的程序名称(为后期记录方便)
  15. FC_IP=127.0.0.1
  16. FC_LOGINUSER=otherapp
  17. FC_PROJECTNAME=炫铃程序

  18. #被比对的原始数据文件,以此文件做标准
  19. FC_CHECK_FILENAME=CRBT_CHECKLIST.TXT
  20. #集团下发版本,生成的数据文件,此文件主要是要和原始文件做比对操作
  21. FC_UPDATE_FILENAME=UPDATE_CRBT_CHECKLIST.TXT
  22. #经过程序处理,最终发生变化,记录结果的文件
  23. FC_RESULT_FILENAME=RESULT_CRBT_CHECKLIST.TXT
  24. #根据结果文件,生成插入数据库的SQL文件
  25. FC_SQL_FILENAME=SQL_CRBT_CHECKLIST.TXT


  26. #处理输出文件路径列表
  27. function DisposeFilePathList
  28. {
  29.   for file in `ls $1`
  30.   do
  31.     if [ -d $1"/"$file ]
  32.     then
  33.       DisposeFilePathList $1"/"$file; #递归调用,输出当前目录下的所有文件
  34.     else
  35.       local filename=$file; #文件名
  36.       local filepath=$1"/"$file; #文件全路径
  37.       local filesize=$(GetFileSize "$filepath"); #调用函数,获取文件大小
  38.       local fileupdatetime=$(GetFileUpdateTime "$filepath"); #调用函数,获取文件的最新更新日期
  39.       echo $filename $filesize $fileupdatetime $filepath;
  40.     fi
  41.   done
  42. }

  43. #获取文件大小(参数为文件的绝对路径)
  44. function GetFileSize
  45. {
  46.   local result=$(GetFileSize_AIX_6_1 "$1");
  47.   echo $result;
  48. }

  49. #获取文件的更新时间(参数为文件的绝对路径)
  50. function GetFileUpdateTime
  51. {
  52.   local result=$(GetFileUpdateTime_AIX_6_1 "$1"); #调用aix6.1系统,获取日期
  53.   echo $result;
  54. }

  55. #获取文件大小,AIX6.1系统支持的函数(参数为文件的绝对路径)
  56. function GetFileSize_AIX_6_1
  57. {
  58.   local result=`ls -l "$1" | awk '{print $5}'`; #文件大小
  59.   echo $result;
  60. }

  61. #获取文件的更新时间,AIX6.1支持的函数(参数为文件的绝对路径)
  62. function GetFileUpdateTime_AIX_6_1
  63. {
  64.   local month=`ls -l "$1" | awk '{print $6}'`; #
  65.   local day=`ls -l "$1" | awk '{print $7}'`; #
  66.   local tmp=`ls -l "$1" | awk '{print $8}'`; #,或者时间的字符串
  67.   
  68.   local tmplen=`echo $tmp | awk '{print length($0)}'`; #长度
  69.   local v_year="";
  70.   local v_month="";
  71.   local v_day="";
  72.   local v_time="";

  73.   if [ $tmplen -gt 4 ]
  74.   then
  75.     v_year=$(GetCurrentYear); #当字符长度大于4,则该字段为时间,因此v_year赋值为当前所属的年份
  76.     v_time=$tmp; #ls命令中的时间
  77.   else
  78.     v_year=$tmp; #文件的年份
  79.     v_time="00:00"; #使用默认值
  80.   fi

  81.   v_month=$(ConvertMonthToNumber "$month");
  82.   v_day=$day;
  83.   echo $v_year-$v_month-$v_day $v_time:00; #返回的格式为yyyy-MM-dd hh:mm:ss
  84. }

  85. #将英文表示的月份变更为数字(01-12)
  86. function ConvertMonthToNumber
  87. {
  88.   local result="";
  89.   case $1 in
  90.   "Jan") result="01";;
  91.   "Feb") result="02";;
  92.   "Mar") result="03";;
  93.   "Apr") result="04";;
  94.   "May") result="05";;
  95.   "Jun") result="06";;
  96.   "Jul") result="07";;
  97.   "Aug") result="08";;
  98.   "Sep") result="09";;
  99.   "Oct") result="10";;
  100.   "Nov") result="11";;
  101.   "Dec") result="12";;
  102.   esac

  103.   echo $result;
  104. }

  105. #获取当前年份(4为数字)
  106. function GetCurrentYear
  107. {
  108.   echo `date +%Y`;
  109. }

  110. #输出原始文件,用此文件做比对源文件
  111. function ExportNormalFile
  112. {
  113.   DisposeFilePathList $FC_HOME > $FC_SOURCE_HOME/$FC_CHECK_FILENAME;
  114. }

  115. #输出集团下发版本的文件列表,使用此文件列表与源文件做对比操作
  116. function ExportUpdateFile
  117. {
  118.   DisposeFilePathList $FC_UPDATE_HOME > $FC_SOURCE_HOME/$FC_UPDATE_FILENAME;
  119. }

  120. #处理数据,该函数有两个参数,第一个参数为比对基准源文件,第二个为要比较数据(一般是更新后的文件)
  121. #比对的依据是:
  122. #1.当更新后的文件名,路径与源文件相同,并且更新后的日期大于源文件的日期时,
  123. #则认为文件发生了变化,此时记录此差异文件的相关数据。(标志位记录为:M)
  124. #2.当更新后的文件追加了一个源文件不存在的文件,此时也做记录。(标志位记录为:A)
  125. function DisposeData
  126. {
  127.   awk 'NR==FNR {a[$5]=$3" "$4; b[$5]=$2} NR>FNR && a[c=$5] > $3 " " $4 {print FC_IP " " FC_LOGINUSER " " FC_PROJECTNAME " M " $1 " "b[c=$5] " " a[c=$5] " " $5 " " $2 " " $3" "$4}' FC_IP="$FC_IP" FC_LOGINUSER="$FC_LOGINUSER" FC_PROJECTNAME="$FC_PROJECTNAME" $2 $1;
  128.   awk 'NR==FNR {a[$5]=$5} NR>FNR && a[b=$5] != $5 {print FC_IP " " FC_LOGINUSER " " FC_PROJECTNAME " A " $1 " " $2 " " $3 " " $4 " " $5 " " $2 " " $3 " " $4}' FC_IP="$FC_IP" FC_LOGINUSER="$FC_LOGINUSER" FC_PROJECTNAME="$FC_PROJECTNAME" $1 $2;
  129. }

  130. #测试,重新刷新对比源文件
  131. ExportNormalFile;

  132. #处理程序,将结果输出到结果文件中
  133. DisposeData $FC_SOURCE_HOME/$FC_CHECK_FILENAME $FC_SOURCE_HOME/$FC_UPDATE_FILENAME > $FC_SOURCE_HOME/$FC_RESULT_FILENAME;
    简单的介绍一下这个脚本,该脚本主要是先递归读取$FC_HOME目录下的文件,作为比对源。生成比对源文件$FC_CHECK_FILENAME,生成的内容如下:
CRBT.jar 13929 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/lib/CRBT.jar
log4j-1.2.15.jar 391834 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/lib/log4j-1.2.15.jar
debug.log 245696 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log
debug.log.2013-11-14 720658 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-14
debug.log.2013-11-15 773496 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-15
debug.log.2013-11-16 970091 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-16
debug.log.2013-11-17 658526 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-17
debug.log.2013-11-18 913028 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-18
debug.log.2013-11-19 893215 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-19
debug.log.2013-11-20 578850 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-20
debug.log.2013-11-21 546380 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-21
debug.log.2013-11-22 884870 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-22
debug.log.2013-11-23 776880 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-23
debug.log.2013-11-24 552617 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-24
debug.log.2013-11-25 628039 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-25
debug.log.2013-11-26 600807 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-26
debug.log.2013-11-27 707239 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-27
debug.log.2013-11-28 794025 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/debug.log.2013-11-28
info.log 64563 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log
info.log.2013-11-14 180050 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-14
info.log.2013-11-15 192512 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-15
info.log.2013-11-16 238187 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-16
info.log.2013-11-17 165062 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-17
info.log.2013-11-18 222352 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-18
info.log.2013-11-19 219595 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-19
info.log.2013-11-20 146193 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-20
info.log.2013-11-21 138638 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-21
info.log.2013-11-22 217735 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-22
info.log.2013-11-23 191727 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-23
info.log.2013-11-24 139895 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-24
info.log.2013-11-25 157321 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-25
info.log.2013-11-26 151000 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-26
info.log.2013-11-27 175851 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-27
info.log.2013-11-28 195700 2013-12-01 14:07:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-28
从上面文件,我们可以清晰的看到,第一列为文件名,第二列为文件大小,第三列,第四列为修改日期,最后一列文件的路径。
同时程序还会读取(当前注释掉了,为了测试方便)$FC_UPDATE_HOME目录下的晚饭么,生成$FC_UPDATE_FILENAME,内容如下:
info.log.2013-11-26 151000 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-26
info.log.2013-12-27 175851 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-12-27
info.log.2013-11-28 95799 2013-12-02 14:07:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-28
从这个测试数据中,我们人工的和上面的比对源文件,进行比对,会发现,第一条记录没有发生变化,第二条记录为新增的,第三条记录为更新的。因此我们的脚本执行,应该是返回两条记录;脚本执行的是Shell代码中的DisposeData,具体我就不详细说明了,脚本代码中的注释的还算比较详细,细心看,应该都能看懂。执行了的结果为(生成$FC_RESULT_FILENAME文件):
127.0.0.1 otherapp 炫铃程序 M info.log.2013-11-28 95799 2013-12-02 14:07:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-11-28 195700 2013-12-01 14:07:00
127.0.0.1 otherapp 炫铃程序 A info.log.2013-12-27 175851 2013-11-29 14:38:00 /ngbss/otherapp/pengtest/CRBT/log/info.log.2013-12-27 175851 2013-11-29 14:38:00
FileCheck.rar
阅读(6451) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~