用于检查远程服务器进程的Perl脚本

时间:2012-11-07 21:40:56

标签: linux perl scripting

我设置的脚本有点问题。一点背景:

脚本的功能是从一个由::分隔的文本文件中的服务器列表中读取,登录到服务器,检查mysql是否正在运行并报告回来。配置文件使每行包含:Servername :: IP地址::端口号

我遇到的问题是我认为perl正在尝试连接我提供给代码中的函数的ip地址。任何人都可以指出我的正确方向吗?

#!/usr/bin/perl                                                                                           

use strict;
use warnings;

open(FH, '<', 'serverlist_test') or error("Cannot open file , ($!)");
while (my $line = <FH>) {
    our ($name, $ip, $port) = split(/::/, $line);
    my $version = &MySQL_check($ip, $port);                                                                                    
}
close FH;

sub MySQL_check {

    my $issue = `ssh -t root@"$_[0]" -p$"_[1]" 'ps axco command | grep -i mysql'`;
    print $issue;
    if ($issue =~ /mysql/) {                                                                             
      return "Mysql found"; 
    } else {                                                                                             
       return "Mysql not found";                                                                         
    }                                                                                                    
}

我做错了什么?

谢谢。

4 个答案:

答案 0 :(得分:1)

my $issue = `ssh -t root@"$_[0]" -p$"_[1]" 'ps axco command | grep -i mysql'`;

看看

-p$"_[1]"

应该是

-p "$_[1]"

答案 1 :(得分:1)

您的代码经过一些修改

...
while (my $line = <FH>) {
    chomp($line); #MOD -- remove newline
    our ($name, $ip, $port) = split("::", $line); #MOD -- change delimiter
...

sub MySQL_check {

    my $issue = `ssh -t root@"$_[0]" -p"$_[1]" 'ps axco command | grep -i mysql'`; #MOD -- fix misplaced double quotes
...

答案 2 :(得分:0)

尝试

our ($name, $ip, $port) = split('::', $line);

答案 3 :(得分:0)

输入一些打印调试代码,以便您可以看到正在运行的命令。所以改变:

my $issue = `ssh -t root@"$_[0]" -p$"_[1]" 'ps axco command | grep -i mysql'`;

my $command = qq`ssh -t root@"$_[0]" -p$"_[1]" 'ps axco command | grep -i mysql'`;
warn "Going to run \"$command\""; # comment this out when your code works!
my $issue = `$command`;

这应该标记命令的问题。几乎可以肯定,因为你没有chomp从文件中读取的行,所以端口号后面实际上有\n