"Fossies" - the Fresh Open Source Software Archive

Member "checksuite-3.3/checkzombie" (3 Jun 2010, 4219 Bytes) of package /linux/privat/checksuite-3.3.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 #!/usr/bin/perl -w
    2 ########################################################
    3 # Z Process Monitor by Larry Long - larry@djslyde.com  #
    4 # [checkzombie] - 9/9 programs in checksuite v3.3      #
    5 #                                                      #
    6 # This checks for processes with the 'Z' state. If     #
    7 # found, it will send an alert and show which ones     #
    8 # are zombies.                                         #
    9 ########################################################
   10 use strict;
   11 use Getopt::Std;
   12 use Net::SMTP;
   13 
   14 $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin';
   15 
   16 # Options: -h (help) -l (log) -o (output to screen) -t (threshold) -e (email)
   17 my %opt;getopts('hlot:e:', \%opt);
   18 usage_info() unless defined @ARGV;
   19 usage_info() if exists $opt{h};
   20 
   21 # Localize variables throughout the rest of the program
   22 my($email,$host,$threshold,@ps_data,$plist,@load,@note,$notify,$logdate,$logfile,$logsnip,$script,$subject,@pnote,$pmail,$psubject,@proc,$proc,$state,$pid,$command);
   23 
   24 # Are we root?
   25 if($> != 0)
   26   {
   27   print STDERR "\n$0: This program HAS to be ran as root!!!\n\nPlease su to root
   28  or use 'sudo $0'!\n";
   29   exit 2;
   30   }
   31 
   32 # Define variables
   33 $threshold = $opt{t};$threshold = '1' unless defined $opt{t};
   34 $email = $opt{e};$email = 'root@localhost' unless defined $opt{e};
   35 $pmail = $opt{p};
   36 $host = `hostname`;
   37 $logfile = "/var/log/checksuite.d/checkzombie";
   38 $logdate = `date '+%m/%d/%Y %H:%M:%S' `;
   39 $script = " - [checksuite] checkzombie\n";
   40 $logsnip = "----\n";
   41 $notify = 0;
   42 $subject = "[checksuite] advisory - processes found with state Z on $host";
   43 $psubject = "[checksuite] checkzombie";
   44 chomp $host;chomp $logdate;chomp $subject;chomp $psubject;
   45 
   46 # Check the processes
   47 push(@note, "\n");
   48 open(PROC, "ps aux | awk '{ print \$8 \" \" \$2 \" \" \$11 }'| grep -v cron| grep -v grep| grep -v sh|");
   49 while(<PROC>)
   50    {
   51    @proc = split(/\s+/, $_);
   52    $state = $proc[0];
   53    $pid = $proc[1];
   54    $command = $proc[2];
   55    if($state eq "Z")
   56       {
   57       push(@note, "Zombie state process found: $pid - $command\n");
   58       $notify++;
   59       }
   60    }
   61 push(@note, "\nYou can force kill a process using 'kill -9' as root.\n\n");
   62 
   63 # Define where the output goes
   64 if($notify > 0)
   65    {
   66    log_data() if exists $opt{l};
   67    email_data() if exists $opt{e};
   68    screen_data() if exists $opt{o};
   69    pager_data() if exists $opt{p};
   70    }
   71 
   72 # Subroutines
   73 sub usage_info
   74    {
   75    my $usage = "
   76 Usage: $0 [-h | -lo] [-t <threshold>] [-e <email>] [-p <email>]
   77 Options:
   78 -h              display this help
   79 -l              log the output to /var/log/checksuite.d/checkzombie
   80 -o              force output to screen
   81 -t              sets the threshold for notification
   82 -e              e-mail the output to a specified e-mail address
   83 -p              send shortened output to a pager or cell phone
   84 Where:
   85 <threshold>     threshold value - default is 1 state Z process
   86 <email>         e-mail address of the recipient of the notification
   87                 default is 'root'
   88 \n";
   89    die $usage;
   90    }
   91 
   92 sub log_data
   93    {
   94    open(LOG, ">>$logfile") or die "Uh oh! Can't open logfile!\n";
   95    print LOG $logdate,$script,@note,$logsnip;
   96    close(LOG);
   97    }
   98 
   99 sub screen_data
  100    {
  101    print STDERR @note;
  102    }
  103 
  104 sub email_data
  105    {
  106    my $smtp = Net::SMTP->new($host);
  107    if(! ref($smtp))
  108       {
  109       log_die("Cannot connect to SMTP\n");
  110       }
  111    $smtp->mail($email);
  112    $smtp->to($email);
  113    $smtp->data();
  114    $smtp->datasend("To: " . $email . "\n");
  115    $smtp->datasend("From: Checksuite Notification <root\@$host>\n");
  116    $smtp->datasend("Return-Path: " . $email. "\n");
  117    $smtp->datasend("Subject: " . $subject . "\n");
  118    $smtp->datasend("\n");
  119    $smtp->datasend(@note);
  120    $smtp->datasend();
  121    $smtp->quit();
  122    }
  123 
  124 sub pager_data
  125    {
  126    my $smtp = Net::SMTP->new($host);
  127    if(! ref($smtp))
  128       {
  129       log_die("Cannot connect to SMTP\n");
  130       }
  131    $smtp->mail($pmail);
  132    $smtp->to($pmail);
  133    $smtp->data();
  134    $smtp->datasend("To: " . $pmail . "\n");
  135    $smtp->datasend("From: Checksuite Notification <root\@$host>\n");
  136    $smtp->datasend("Return-Path: " . $pmail. "\n");
  137    $smtp->datasend("Subject: " . $psubject . "\n");
  138    $smtp->datasend("\n");
  139    $smtp->datasend(@pnote);
  140    $smtp->datasend();
  141    $smtp->quit();
  142    }
  143