脚本功能:

脚本使用Perl语言写成,获取服务器系统信息,并发送html格式邮件

由于整篇文章超过了8万字符,所以代码部分没有发全,请下载附件

脚本适用场合:
不便于使用nagios等监控软件
不想安装nagios等监控软件(服务器数量比较少)

脚本适用操作系统:
仅适用于redhat和centos系列

简单使用步骤:

1.安装所需要的Perl模块(需要ROOT身份安装),详看使用脚本的准备工作部分

2.脚本上传至服务器,增加可执行权限

3.定制计划任务

如:0 9-18/1 * * 1,2,3,4,5 /root/getSystemInformation.pl

系统信息包括:

  • 系统当前负载
  • 总进程数量
  • 当前运行的进程数量
  • 系统当前远程登录用户数量
  • 系统已经运行多长时间
  • 系统版本、系统位数、内核版本
  • 当前网卡流量
  • 磁盘使用情况
  • 内存使用情况
  • SWAP使用情况
  • 当前关键进程信息
  • 当前80端口的网络连接状态
  • mysql主从复制状态
  • /var/log/messages中的错误信息(如果只想要该功能参考 http://linux5588.blog.51cto.com/65280/973962 上一个博文)

邮件效果如下:


 

使用脚本的准备工作:
需要安装以下perl模块,需要root身份来安装这些模块
Authen::SASL 用于验证邮件的用户名和密码
Filesys::Df 用于获取磁盘分区信息
DBI 用于连接mysql数据库(如果不需要检查mysql主从状态,则不需要安装,同时注释 require 'DBI.pm';)
DBD::mysql 用于连接mysql数据库(如果不需要检查mysql主从状态,则不需要安装,同时注释 require 'DBD/mysql.pm';)
安装可先检查这些模块的安装情况,使用以下命令进行检查

 
    
  1. perl -e "use Authen::SASL" 其他模块也是如此检查 
  2. perl -e "use Filesys::Df" 
  3. perl -e "use DBI" 
  4. perl -e "use DBD::mysql" 


执行完成后,没有任何输出则表示,该模块已安装,如果有报错信息,则需要安装该模块.
注意不需要检查mysql主从状态的,则不需要安装DBI DBD::mysql
如果需要安装DBI DBD::mysql 这2个模块的话,请确保PATH环境变量里面有Mysql的bin目录,不然安装过程会报错

 
    
  1. export PATH=$PATH:/usr/local/mysql/bin 

然后再进行以下的操作。

 

安装方式有以下2种:
第一种:一键安装所需的模块(服务器需能上网)

 
    
  1. cpan Authen::SASL Filesys::Df DBI DBD::mysql 

如果有像这样的询问

 
    
  1. Are you ready for manual configuration? [yes] no  


这里选择no,因为这是询问你是否要手动配置,手工配置比较麻烦,还是让程序自动配置一些路径。

如果有像这样的询问

 
    
  1. Shall I follow them and prepend them to the queue 
  2.  of modules we are processing right now? [yes] 这里直接回车即可 

 

第二种:进行手工编译安装

Authen::SASL 下载地址:

 
    
  1. http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Authen-SASL-2.16.tar.gz 


Filesys::Df 下载地址:

 
    
  1. http://search.cpan.org/CPAN/authors/id/I/IG/IGUTHRIE/Filesys-Df-0.92.tar.gz 


DBI 下载地址:

 
    
  1. http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.622.tar.gz 


DBD::mysql 下载地址:

 
    
  1. http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.022.tar.gz  

 

手工编译安装一般按照这个步骤(最好先看看目录下面的README文件),比如安装Filesys::Df这个模块

 
    
  1. tar zxf Filesys-Df-0.92.tar.gz 
  2. cd Filesys-Df-0.92 
  3. perl Makefile.PL 
  4. make 
  5. make test 
  6. make install 

脚本内容如下:

脚本中红色注释请注意,由于整篇文章超过了8万字符,所以代码部分没有发全,请下载附件。

 
    
  1. #!/usr/bin/perl 
  2.  use Cwd;                                       #获取当前目录路径 
  3.  use Sys::Hostname;                             #获取主机名 
  4.  use Socket;                                    #用于获取IP地址 
  5.  use Net::SMTP;                                 #用于发送邮件 
  6.  use Authen::SASL;                              #用于验证邮件的用户名和密码 
  7.  use File::Basename;                            #用于取得脚本的名字 
  8.  use Filesys::Df;                               #用于获取磁盘分区信息 
  9.  require 'sys/ioctl.ph';                        #用于获取IP地址 
  10.  require 'DBI.pm';                              #用于连接mysql数据库,不需要请注释掉(前面添加#) 
  11.  require 'DBD/mysql.pm';                        #用于连接mysql数据库,不需要请注释掉 
  12.   
  13.  # 2012年10月22日 Leo [email protected] 
  14.  # Blog:http://linux5588.blog.51cto.com 
  15.  # 本脚本只适合Redhat和CentOS系列的Linux系统 
  16.   
  17.  #以下定义的变量需要修改 
  18.  my $interface = "eth0";                        #邮件内容中显示的IP地址和流量统计的接口 
  19.  my $process_pattern = "httpd|java|mysqld";     #想要查看关键进程的名称 
  20.  my @partitions = ("/","/data","/backup_svn");  #想要查看的磁盘分区 
  21.  my $logfile ="/var/log/messages";              #要读取的日志文件 
  22.  my $countfile ="/var/log/last_messages.size";  #用于存放上一次读取日志文件的位置,要有可写入权限 
  23.  my $error_pattern = "(?:Error|Warning|Invalid)";#用于匹配日志文件中的error行或者warn行或者Invalid行 
  24.   
  25.  #发送邮件设置,需要修改 
  26.  my $site = '163.com';                          #用于标识发送邮件时的邮件域 
  27.  my $smtp_host = 'smtp.163.com' ;               #发送的邮件服务器 
  28.  my $from = '[email protected]';                      #发送邮件的帐号 
  29.  my $password = 'xxxxxxx';                      #帐号密码 
  30.  my $to = '[email protected]';             #收件人 
  31.  my $subject = '服务器系统信息';                  #设置邮件主题 
  32.  my $from_info = '服务器监控邮件';              #设置发件人信息 
  33.  # my $to2 = '[email protected]';                  #设置第二个个收件人 
  34.  # my $to3 = '[email protected]';                   #设置第三个个收件人 
  35.   
  36.  #mysql从服务器设置,如果不需要检查mysql主从状态请注释掉这些变量,如果需要检查请修改 
  37.  my $slave_ip = '192.168.100.253';              #从服务器的IP地址,一般写内网IP地址 
  38.  my $database_name = 'test';                    #连接的数据库,默认是test数据库 
  39.  my $database_user = 'root';                    #从服务器登录mysql的用户名 
  40.  my $database_password = '123456';              #从服务器登录mysql的密码 
  41.   
  42.  #以下定义的变量不需要修改 
  43.  my $currentscriptpid = $$;                     #脚本自身的PID 
  44.  my $hostname = hostname;                       #得到主机名 
  45.  my $date = &getDate;                           #获取日期 
  46.  my $currentPwd = cwd;                          #得到当前目录路径 
  47.  my $proc = "/proc";                            #/proc目录变量 
  48.  my $ip = &getIP($interface);                   #获取IP地址  
  49.  my $basename = basename $0;                    #取得脚本的名字 
  50.  my $temp_log = "/tmp/$basename.log";           #临时文件,用于写入系统信息,用完后会删除 
  51.  my $run_log = "/tmp/${basename}_Running_Error.log";#脚本运行时错误日志 
  52.   
  53.  #调用主函数执行程序 
  54.  &main; 
  55.   
  56.  #主函数调用其他函数 
  57.  sub main { 
  58.     #改变当前工作目录到/proc目录 
  59.     chdir "$proc" or die "Can't change $proc: $!\n"
  60.   
  61.     #打开错误日志文件句柄 
  62.     open RUNLOG,">>","$run_log" or warn "Can't write running log\n"
  63.     print RUNLOG "$date\n","=" x 19,"\n"
  64.   
  65.     #调用所有的函数,把获取到的信息写入到临时文件中 
  66.     &getSystemOverview;                          
  67.     &getPerSecondTraffic;                            
  68.     &getDiskUsage;                               
  69.     &getMemoryUsuage;                               
  70.     &getSwapUsage;                                 
  71.     &getTotalProcess;                               
  72.     &getHttpPortConnectionStatus;                  
  73.     #&checkMysqlMasterSlaveStatus;  #如果需要检查mysql主从状态,去掉注释即可             
  74.     &getErrorLogFromMessages;                    
  75.   
  76.     #调用写html函数,把获得到的信息写成html格式 
  77.     &WriteHtml; 
  78.   
  79.     #关闭错误日志文件句柄 
  80.     print RUNLOG "\n"
  81.     close RUNLOG; 
  82.   
  83.     #打开临时文件,读取文件的内容并发送邮件 
  84.     open READLOG,"<","$temp_log" or die "Can't read $temp_log : $!"
  85.     @temp_information = 
  86.     close READLOG; 
  87.     &SendMail(@temp_information); 
  88.   
  89.     #改变当前工作目录到原来的工作目录 
  90.     chdir "$currentPwd" or warn "Can't change to $currentPwd : $!\n"
  91.  } 
  92.   
  93.  #把获取到的系统信息写成html格式 
  94. #如果不需要检查mysql主从状态,和80的端口的网络连接状态,请删除红色表示那部分(142-147行)
  95.  sub WriteHtml { 
  96.     eval { 
  97.         open WRITELOG,">","$temp_log" or die "Can't write $temp_log : $!"
  98.         format WRITELOG = 
  99.          
  100.              
  101.                 

    系统信息概览

     
  102.                 时间: @<<<<<<<<<<<<<<<<<<<<   主机: @<<<<<<<<<<<<<<<<<<<<<<<   IP地址: @<<<<<<<<<<<<<<<<<<<<<<<<<   
     
  103.                         $date                               $hostname                               $ip 
  104.                 系统当前负载: @<<<<<<<<<<<<<<<<<<<<<<<<<<   
     
  105.                                 $load 
  106.                 总进程数量: @<<<<<<<<<<    当前运行的进程的个数: @<<<<<<<<<<<  
     
  107.                             $totalProcess                             $runningprocess 
  108.                 系统当前远程登录用户数: @<<<<<<<<<<个  
     
  109.                                             $user 
  110.                 系统已经运行: @<<<<<<<<<<<<<<<<<< 
     
  111.                                 $starttime 
  112.                 系统版本: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   系统位数: @<<<<<<<<<< 位 
     
  113.                                     $linux_version                                                                      $linux_bit 
  114.                 内核版本: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
  115.                                 $kernel_version  
  116.                 

    当前网卡流量

      
  117.                 接收: @<<<<<<<<<<< 
     
  118.                         $RX 
  119.                 发送: @<<<<<<<<<<< 
     
  120.                         $TX 
  121.                 

    磁盘使用情况

     
  122.                 @*   
  123.                 $disk_size 
  124.                 --------- 
     
  125.                 @*  
  126.                 $partitions      
  127.                 

    当前内存使用

     
  128.                 总内存大小:   @<<<<<<<<<<<  
     
  129.                                     $Total_Memory 
  130.                 已经使用的内存大小:   @<<<<<<<<<<<<<<<<<  
     
  131.                                             $Used_Memory 
  132.                 还剩余的内存大小:   @<<<<<<<<<<<<<<<<<<<<   
     
  133.                                           $Available_Memory  
  134.                 

    当前SWAP使用

     
  135.                 总大小:   @<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
  136.                                 $total_swap 
  137.                 已经使用大小:   @<<<<<<<<<<<<<<<<<<<<<<<<  
     
  138.                                       $used_swap 
  139.                 

    当前关键进程信息

     
  140.                 @*              
     
  141.                 $process 
  142.                 

    当前80端口的网络连接状态

     
  143.                 @*              
     
  144.                 $status 
  145.                 

    Mysql 主从复制状态

     
  146.                 @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   
     
  147.                 $mysqlslavestatus 
  148.                 

    @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 日志文件中的错误信息 

     
  149.                             $logfile 
  150.                 @* 
  151.                 $errorlog 
  152.              
  153.          
  154.  . 
  155.         write WRITELOG; 
  156.         close WRITELOG;  
  157.     }; 
  158.     if ($@) { 
  159.         print RUNLOG "Occurred Error ($@)\n"
  160.     } 
  161.  } 
  162.   
  163.  #获取日期 
  164.  sub getDate { 
  165.        my ($sec$min$hour$mday$mon$year) = (localtime)[0..5]; 
  166.        $date = sprintf "%4d-%02d-%02d %2d:%02d:%02d",$year + 1900,$mon + 1 ,$mday ,$hour ,$min ,$sec
  167.  } 
  168.   
  169.  #获取IP地址 
  170.  sub getIP { 
  171.     eval { 
  172.         my $pack = pack("a*", shift); 
  173.         my $socket
  174.         socket($socket, AF_INET, SOCK_DGRAM, 0); 
  175.         ioctl($socket, SIOCGIFADDR(), $pack); 
  176.         $ipaddr = inet_ntoa(substr($pack,20,4)); 
  177.     }; 
  178.     if ($@) { 
  179.         print RUNLOG "Occurred Error ($@)\n"
  180.     } 
  181.     return $ipaddr
  182.  } 
  183.   
  184.  #发送邮件函数 
  185.  sub SendMail { 
  186.     eval { 
  187.           my $smtp = Net::SMTP->new($smtp_host,Timeout=>30,Hello=>$site); 
  188.           $smtp-> auth($from$passwordor die "Email user or password Auth Error!\n"
  189.           $smtp-> mail($from); 
  190.           $smtp-> to($to); 
  191.           #$smtp-> to($to,$to2,$to3);       #同时发送给多个人 
  192.           $smtp-> data(); 
  193.           $smtp-> datasend("Subject: $subject\n"); 
  194.           $smtp-> datasend("From: $from_info\n"); 
  195.           $smtp-> datasend("To: $to"); 
  196.           $smtp-> datasend("\n" ); 
  197.           $smtp-> datasend("Mime-Version:1.0\n");        
  198.           $smtp-> datasend("Content-Type: text/html;charset=utf-8\n");   
  199.           $smtp-> datasend("Content-Transfer-Encoding: quoted-printable\n\n"); 
  200.           $smtp-> datasend("@_\n" ); 
  201.           $smtp-> dataend(); 
  202.           $smtp-> quit; 
  203.     }; 
  204.     if ($@) { 
  205.         print RUNLOG "Occurred Error ($@)\n"
  206.     } 
  207.  } 
  208.   
  209.  #获取系统概览信息 
  210.  sub getSystemOverview { 
  211.     &getLinuxVersion;        
  212.     &getSystemBit;               
  213.     &getCurrentLoginUser;        
  214.     &getSystemAlreadyStartTime;  
  215.     &getRunningProcessAndLoad; 
  216.     eval { 
  217.        open VERSION,"<","./version" or die "Can't open version : $!"
  218.        $version_str = 
  219.        close VERSION; 
  220.        $where1 = index($version_str,"(");  
  221.        $kernel_version = substr($version_str,0,$where1); 
  222.     }; 
  223.     if ($@) { 
  224.         print RUNLOG "Occurred Error ($@)\n"
  225.     } 
  226.   
  227.     #获取Linux版本 
  228.     sub getLinuxVersion { 
  229.         eval { 
  230.             open LINUXVERSION,"<","/etc/redhat-release"
  231.             chomp($linux_version = ); 
  232.             close LINUXVERSION; 
  233.         }; 
  234.         if ($@) { 
  235.             print RUNLOG "Occurred Error ($@) \n"
  236.         } 
  237.     } 
  238.   
  239.     #获取系统的位数 
  240.     sub getSystemBit { 
  241.         eval { 
  242.             chomp($linux_bit = `getconf LONG_BIT`); 
  243.         }; 
  244.         if ($@) { 
  245.             print RUNLOG "Occurred Error ($@)\n"
  246.         } 
  247.     } 
  248.   
  249.     #获取当前远程登录的用户 
  250.     sub getCurrentLoginUser { 
  251.         eval { 
  252.             $user = 0; 
  253.             foreach (`w`) { 
  254.                 $user++ if /\b\d+\.\d+\.\d+\.\d+\b/; 
  255.             } 
  256.         }; 
  257.         if ($@) { 
  258.             print RUNLOG "Occurred Error ($@)\n"
  259.         } 
  260.     } 
  261.   
  262.     #获取启动时间 
  263.     sub getSystemAlreadyStartTime { 
  264.         eval { 
  265.             open UPTIME,"<","./uptime" or die "Can't read:$!\n"
  266.             $starttime = (split /\s+/,)[0]; 
  267.             close UPTIME; 
  268.             if ($starttime >= 86400) { 
  269.                 $starttime = sprintf ("%d 天",$starttime/86400); 
  270.             } 
  271.             elsif ($starttime < 3600) { 
  272.                 $starttime = sprintf ("%d 分钟",$starttime/60); 
  273.             } 
  274.             else { 
  275.                 $starttime = sprintf ("%d 小时",$starttime/3600); 
  276.             } 
  277.         }; 
  278.         if ($@) { 
  279.             print RUNLOG "Occurred Error ($@)\n"
  280.         } 
  281.     } 
  282.   
  283.     #获取CPU的负载和正在运行的进程数量 
  284.     sub getRunningProcessAndLoad { 
  285.         eval { 
  286.             open LOAD,"<","./loadavg" or die "Can't read:$!\n"
  287.             ($load1,$load5,$load10,$runningprocess) = (split /\s+/,)[0..3]; 
  288.             close LOAD; 
  289.             $load = $load1 . " " . $load5 . " " . $load10
  290.             $runningprocess = substr($runningprocess,0,1); 
  291.         }; 
  292.         if ($@) { 
  293.             print RUNLOG "Occurred Error ($@)\n"
  294.         } 
  295.     } 
  296.  } 
  297.   
  298.   
  299.  #计算总进程数量 
  300.  sub getTotalProcess { 
  301.     eval { 
  302.         opendir my $PROCDIR , '.' or die "Unable to open $proc: $!\n"
  303.         my @procdir = readdir $PROCDIR  or die "Unable to read $workdir: $!\n"
  304.         close $PROCDIR
  305.          
  306.         foreach my $pid (@procdir){ 
  307.             next if ( $pid eq '.' ); 
  308.             next if ( $pid eq '..' ); 
  309.             next unless (-d $pid); 
  310.             if ($pid =~ /\b\d+\b/) { 
  311.                 push @pid_numbers,$pid
  312.                 $totalProcess++;     
  313.             } 
  314.         } 
  315.         &getPidNameAndMemory(@pid_numbers); 
  316.     }; 
  317.     if ($@) { 
  318.         print RUNLOG "Occurred Error ($@)\n"
  319.     } 
  320.      
  321.     #获取每个主要进程信息(内存占用、PID、进程名称) 
  322.     sub getPidNameAndMemory { 
  323.         eval { 
  324.                 foreach (@_){ 
  325.                     next if($_ == 1); 
  326.                     next if($_ == $currentscriptpid); 
  327.                     open PIDSTATUS,"<","./$_/status" or die "Unable to open $pid_temp: $!\n"
  328.                     @pid_name_mem = 
  329.                     close PIDSTATUS; 
  330.                     if ($pid_name_mem[0] =~ /\b(?:$process_pattern)\b/) { 
  331.                         $pid_name = (split /\s+/,$pid_name_mem[0])[1]; 
  332.                         $pid_memory = (split /\s+/,$pid_name_mem[15])[1]; 
  333.                         $pid_memory = &FormatSize($pid_memory * 1024); 
  334.                         $pid_directory = readlink "$_/cwd"
  335.                         @$_ = ($pid_name,$_,$pid_memory,$pid_directory); 
  336.                         push @pid_information_array,[@$_]; 
  337.                     }        
  338.                 } 
  339.                  
  340.                 foreach my $pid_array (@pid_information_array){ 
  341.                     $process = "进程名: $$pid_array[0]" . " \  " . "PID: $$pid_array[1]" . " \  " . "内存占用: $$pid_array[2]" . " \  " . "工作目录: $$pid_array[3]" . "
    "
     . "\n$process";            
  342.                 } 
  343.             }; 
  344.         if ($@) { 
  345.             print RUNLOG "Occurred Error ($@)\n"
  346.         } 
  347.     } 
  348.  } 
  349.   
  350.  #获取总内存大小、已经使用内存大小及可用内存大小使用情况 
  351.  sub getMemoryUsuage { 
  352.     eval { 
  353.         open MEMTOTAL,"<","./meminfo" or die "Can't read:$!\n"
  354.         my @memory_usuage; 
  355.   
  356.         for (my $var=0; $var<4; $var++) { 
  357.             chomp($mem_temp = ); 
  358.             push @memory_usuage,(split /\s+/,$mem_temp)[1]; 
  359.         } 
  360.         close MEMTOTAL; 
  361.   
  362.         #计算内存总大小 
  363.         $Total_Memory_Temp = $memory_usuage[0]; 
  364.         $Total_Memory = &FormatSize($Total_Memory_Temp * 1024); 
  365.   
  366.         #计算可用内存大小 
  367.         $Available_Memory_Temp = $memory_usuage[1] + $memory_usuage[2] + $memory_usuage[3]; 
  368.         $Available_Memory = &FormatSize($Available_Memory_Temp * 1024); 
  369.   
  370.         #计算已经使用的内存大小 
  371.         $Used_Memory = $Total_Memory_Temp - $Available_Memory_Temp
  372.         $Used_Memory = &FormatSize($Used_Memory * 1024); 
  373.     }; 
  374.     if ($@) { 
  375.         print RUNLOG "Occurred Error ($@)\n"
  376.     } 
  377.  } 
  378.   
  379.  #计算swap使用情况 
  380.  sub getSwapUsage { 
  381.     eval { 
  382.         open SWAP,"<","./swaps" or die "Can't read swaps file : $!"
  383.         @swap = 
  384.         close SWAP; 
  385.         ($total_swap,$used_swap) = (split /\s+/,$swap[1])[2,3]; 
  386.         $total_swap = &FormatSize($total_swap * 1024); 
  387.         $used_swap = &FormatSize($used_swap * 1024); 
  388.     }; 
  389.     if ($@) { 
  390.         print RUNLOG "Occurred Error ($@)\n"
  391.     } 
  392.  } 
  393.   
  394.  #获取磁盘分区使用情况 
  395.  sub getDiskUsage { 
  396.     eval { 
  397.         open PARTITION,"<","./partitions" or die "Can't read: $!\n"
  398.         while () { 
  399.             if ($. > 2) { 
  400.                 if (/\b[a-z]+\b/) { 
  401.                     ($total,$disk) = (split)[2,3]; 
  402.                     $disk = '/dev/' . "$disk"
  403.                     ($sum_used_disk,$sum_available) = &getUsedAndFreeTotalSize($disk); 
  404.                     $total = &FormatSize($total * 1024); 
  405.                     $sum_used_disk = &FormatSize($sum_used_disk); 
  406.                     $sum_available = &FormatSize($sum_available); 
  407.                     $disk_size = "$disk" . " \  " . "总大小: $total" . " \  " . "可用: $sum_available" . " \  " . "已用: $sum_used_disk""
    "
     . "\n$disk_size"
  408.                 } 
  409.             } 
  410.         } 
  411.         close PARTITION; 
  412.     }; 
  413.     if ($@) { 
  414.         print RUNLOG "Occurred Error ($@) \n"
  415.     } 
  416.   
  417.     #计算各分区可用空间总和和已使用空间的总和 
  418.     sub getUsedAndFreeTotalSize { 
  419.         eval { 
  420.             my $disk = shift @_; 
  421.             foreach (`df -Pk`) { 
  422.                 if (/^(?:$disk\d+)/) { 
  423.                     ($used_disk,$available_disk) = (split)[2,3]; 
  424.                     $sum_used_disk = $sum_used_disk + $used_disk
  425.                     $sum_available = $sum_available + $available_disk;           
  426.                 } 
  427.             } 
  428.         }; 
  429.         if ($@) { 
  430.             print RUNLOG "Occurred Error ($@)\n"
  431.         } 
  432.         return $sum_used_disk * 1024,$sum_available * 1024; 
  433.     } 
  434.   
  435.     #主要分区的使用情况 
  436.     &getPartitionSize; 
  437.     sub getPartitionSize { 
  438.         eval { 
  439.                 foreach (@partitions){ 
  440.                 my $partitions_size = df("$_"); 
  441.                 $total = &FormatSize($partitions_size->{blocks} * 1024); 
  442.                 $free = &FormatSize($partitions_size->{bfree} * 1024); 
  443.                 $used = &FormatSize($partitions_size->{used} * 1024); 
  444.                 $partitions = "分区: $_" . " \  " . "总大小: $total" . " \  " . "可用: $free" . " \  " . "已用: $used" . "
    "
     . "\n$partitions"
  445.             } 
  446.         }; 
  447.         if ($@) { 
  448.             print RUNLOG "Occurred Error ($@)\n"
  449.         } 
  450.     } 
  451.  } 
  452.   
  453.  #获取每秒的流量,以KB/s和MB/s,这里的B是字节 
  454.  sub getPerSecondTraffic { 
  455.     &getTraffic; 
  456.     $RX = $traffic[2] - $traffic[0]; 
  457.     $RX = &formatTrafficSize($RX); 
  458.     $TX = $traffic[3] - $traffic[1]; 
  459.     $TX = &formatTrafficSize($TX); 
  460.   
  461.     #获取发送和接收的流量 
  462.     sub getTraffic { 
  463.         eval { 
  464.             $flag++;         
  465.             open TRAFFIC,"<","./net/dev" or die "Can't read /proc/net/dev: $!"
  466.             chomp(@traffic_temp = ); 
  467.             close TRAFFIC; 
  468.             foreach my $j (@traffic_temp) { 
  469.                 if ($j =~ /\s+$interface/) { 
  470.                     my($rx,$tx) = (split /\s+/,(split /:/,$j)[1])[0,8]; 
  471.                     push @traffic,$rx
  472.                     push @traffic,$tx;   
  473.                 } 
  474.             } 
  475.             if ($flag < 2) { 
  476.                 sleep 1; 
  477.                 &getTraffic; 
  478.             } 
  479.         }; 
  480.         if ($@) { 
  481.             print RUNLOG "Occurred Error ($@)\n"
  482.         } 
  483.         return
  484.     } 
  485.  } 
  486.   
  487.  #获取80端口的网络连接状态 
  488.  sub getHttpPortConnectionStatus { 
  489.     eval { 
  490.         foreach (`netstat -ant`) { 
  491.             my ($port,$status) = (split)[3,-1]; 
  492.             if ($port =~ /:\b80\b$/){ 
  493.                 $network_status{$status}++; 
  494.             } 
  495.         } 
  496.         foreach (keys %network_status){ 
  497.             $status = "$_ = $network_status{$_}" . "
    "
     . "\n$status"
  498.         } 
  499.     }; 
  500.     if ($@) { 
  501.         print RUNLOG "Occurred Error ($@)\n"
  502.     } 
  503.  }