Solved

Require Perl script to get system load and uptime on remote UNIX hosts

Posted on 2010-08-13
10
1,838 Views
Last Modified: 2013-12-27
I need help in executing the uptime on remote unix servers mainly linux and solaris as well as sun containers. I am able to get the uptime on local system but when I execute the code with arguments  I am unable to get the logic right. I need to pass arguments with perl script which i have to integrate with a monitoring tool to set the threshold.


#!/usr/bin/perl -w

 # my $MYHOME=$ENV($MYHOME);
 # $MYHOME="/home/anil" if (not $MYHOME);
 open(LOG, ">/tmp/uptime.pl.log") or die "Can't open file: $!";
 my $ScriptDir="/home/anil";
 print LOG  "Arg1=$ARGV[0], Arg2=$ARGV[1], Arg3=$ARGV[2], Arg4=$ARGV[3]\n";

 exit if not ($ARGV[0] eq "-stat" || $ARGV[0] eq "-config");

  my $ip=$ARGV[3];
  exit 1 if (not $ip);
  
  my $user="root";
  $user=$ARGV[4] if ($ARGV[4]);
  #my @result;
  my $keyfile="/root/.ssh/id_rsa";
	sub query {
	open (RESULT, "ssh 2>/dev/null -l $user -i $keyfile -oStrictHostKeyChecking=no -oBatchMode=yes $ip $cmd |") || die "can't connect to $ip";
	@result = <RESULT>;
	close RESULT;
}       
	$os = `uname -s`;

 	if ($os =~ /Linux/)
 {	
     $uptime=`ps -eo pid,comm,etime | grep init`;
 }
 else 
 {
     $uptime=`ps -p 1 -o etime | tail -1`;
 }

 if ($uptime =~ /[0-9]+\-/) 
 {
     ($Days, $Hours, $Minutes, $Seconds) = $uptime =~ /([0-9]*)\-?([0-9]+):([0-9]+):([0-9]+)/;
 } 
 elsif  
     ($uptime =~ /[0-9]+:[0-9]+:[0-9]+/) 
 {
     ($Hours, $Minutes, $Seconds) = $uptime =~ /([0-9]+):([0-9]+):([0-9]+)/;
      $Days = 0;
 } 
 else 
 {
     ($Minutes, $Seconds) = $uptime =~ /([0-9]+):([0-9]+)/;
      $Days = 0;
      $Hours = 0;
 }
  query();
    for each $_ (@result) {
     $t_uptime = eval($Days*24*60 + $Hours*60 + $Minutes);
    } 
     print ("uptime: $t_uptime \n");

Open in new window

0
Comment
Question by:amk2121
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
10 Comments
 

Author Comment

by:amk2121
ID: 33434887
I require a solution to the above. I have the script which runs when the remote execution code from the perl script is removed.. I need to execute the script on a remote Unix server (Linux /Solaris) using ssh and secure RSA key to first get the uptime and convert the uptime into total minutes.

Please let me know if you require more information
0
 
LVL 28

Expert Comment

by:Jan Springer
ID: 33436486
Please give an example of some arguments.  If I'm understanding the question properly, you may need to "shift" in the beginning of your script.
0
 

Author Comment

by:amk2121
ID: 33439250
the script will remotely log into a target server and report the following data by printing it to stdout

Response Time=NNN  (in seconds)
Uptime=NNN  (in minutes)
System Load=NN.mm (float number)
AVAILABILITY=   (0 or 100)

The script will have input argument specifying desired timeout in seconds
If operation can not be completed in that time then AVAILABILITY reported should be set to 0
The script must finish after TimeOut seconds and should not be hanging around waiting for connection (hint: use timeout parameter to ssh command).


The script will be called with these arguments:

ScriptName Arg1 Arg2 TimeOut TargetServer UserName
 
You can ignore Arg1 and Arg2 but they will be there!
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 10

Expert Comment

by:APNFSSC
ID: 33460183
have a look at Net::SSH to run the remote commands... also I'm not sure if this is true on all nix systems but /proc/uptime contains the uptime in seconds if that is any help.

Also have a look at Getopt::Long to help with handling the arguments that your passing through.

As for the timeout I'm not sure how you can handle that... i think the ssh will just time out by itself if it cannot connect.
0
 
LVL 3

Expert Comment

by:ckhsu1977
ID: 33490535
a bit curious about your script.
Regardless of what user you set $user, you'll still use /root/.ssh/id_rsa as the private key. Seems odd.
How are you passing and what commands are you passing for $cmd in the subroutine query?
0
 

Author Comment

by:amk2121
ID: 33518340
I got the script working and yes there was a wrong logic expressed in my code snippet above.

Thanks for all your support
0
 
LVL 10

Expert Comment

by:APNFSSC
ID: 33518455
What did you end out altering that made it work?
0
 

Accepted Solution

by:
amk2121 earned 0 total points
ID: 33541096
I changed the script and used a logic pertaining to my requirement.

$user = "root";
$ips=$ARGV[0];                    ## this holds the command needs to run on remote host.
@ipary= split(/\,/,$ips);       ## split if there are more then one host
for $ipary(@ipary){

print ("\n");
print "connecting ......$ipary \n";
$CMD="ps -eo pid,comm,etime | grep init > xyz.dat";
$IDENT="/root/.ssh/id_rsa";
system("ssh $user\@$ipary -i $IDENT -o ConnectTimeout=$ARGV[1]  $CMD");    ## execute ssh command
$uptime=`cat xyz.dat | tail -1`;
0
 

Author Comment

by:amk2121
ID: 34497438
all went well and my script works good
0
 

Author Closing Comment

by:amk2121
ID: 34860165
I got help from others and made changes to the script which ultimately worked
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I have been pestered over the years to produce and distribute regular data extracts, and often the request have explicitly requested the data be emailed as an Excel attachement; specifically Excel, as it appears: CSV files confuse (no Red or Green h…
There are many situations when we need to display the data in sorted order. For example: Student details by name or by rank or by total marks etc. If you are working on data driven based projects then you will use sorting techniques very frequently.…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…
Suggested Courses

737 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question