Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, Found that this link for asking any doubts regarding perl. I have automated a verifying processes are runing or not on a server by below code

use strict; my @pslist = ("ps -ef|grep psname=abc","ps -ef|grep psname=def",...,); foreach my $ps(@pslist) { print "Checking for the Process,"; my $ps1 = `$ps`; if($ps1 =~ /psname=abc/) { print "\"abc\" is running Fine\n"; } elsif($ps1 =~ /psnameame=def/) { print "\"def\" is running fine\n"; } elsif($ps1 =~ /psname=xyz/) { print "\xyz\" is running Fine\n"; } else { print "None of the processes are running\n"; } }
This is working as expected, i just wanted to check different processes on different servers, i use to login to server by putty via ssh for verifying processes for a single server.in order to verify different processes on different unix servers, please suggest me the way to do this.
  • Comment on How to automate login to different servers via ssh and check is some specific processes are running or not.
  • Download Code

Replies are listed 'Best First'.
Re: How to automate login to different servers via ssh and check is some specific processes are running or not.
by keszler (Priest) on Dec 12, 2014 at 15:37 UTC
    You might want to look into Rex, and specifically Rex HowTo: Listing all running processes.
    use Rex::Commands::Process; user "my-user"; password "my-password"; pass_auth; group myserver => "mywebserver", "mymailserver", "myfileserver"; desc "List all running processes"; task "ps", group => "myserver", sub { for my $process ( ps() ) { say "command: " . $process->{"command"}; say "pid : " . $process->{"pid"}; say "user : " . $process->{"user"}; } };
Re: How to automate login to different servers via ssh and check is some specific processes are running or not.
by Anonymous Monk on Dec 12, 2014 at 12:46 UTC

    To clarify, do you want to know how to log on to remote servers to execute the code that you have posted?

      Thanks for the reply, for executing command on remote host we can use ssh user@server path/script or unix command,but i don't want to type a command each time. For verifying diff processes on diff servers, i just wanted to write a script to do that. For ex: if in server1 i need to check 10 processes and in server 2 i need to check for 20 processes and for server 3, for this i wanted to include whole thing in a script to do this.

        To avoid supplying ssh password, use a ssh key with a key-agent. Also, do a search around these parts related to logging on to a ssh host & running commands.

        Use some kind of configuration -- hash, external files, __DATA__, etc -- to associate processes to a server ...

        # Untested, incomplete code. my %map = ( 'host-p' => [qw[ cron apache ]] , 'host-q' => [qw[ ntpd ]] ); for my $host ( sort keys %map ) { # Log on $host at this point. # Check processes. foreach my $proc ( @{ $map{ $host } } ) { printf qq[%s: %3s running] , $proc , check_proc( $proc ) ? '' : 'not' ; } # Log off. } sub check_proc { my ( $proc ) = @_; my $ps = make_ps( $proc ); my $res = qx[ $ps ]; # Check $? for cause of failure if you care. return defined $res && $res =~ m{ \b psname = $proc \b }x; } sub make_ps { return sprintf q[ps -ef | grep psname=%s] , $_[0] ; }

        Your process checking looks too complicated; there might be OS specific commands/options that won't require filtering of ps run itself. Perhaps some native Perl module may be in existence for the purpose.