试图让Perl脚本正确计算来自进程grep的结果数

试图让Perl脚本正确计算来自进程grep的结果数,perl,grep,Perl,Grep,全部, 我试图grep一个特定的进程,该进程的输出中包含列出的路径(显示在@t_进程数组中)。默认情况下,计数将始终为1,因为用于grep的命令也将显示在输出中。因此,我使用的是,如果计数大于1,那么它确实正在运行。当我grep它们时,所有这些进程都启动了,并且至少有两个结果返回到命令行。但是,当我运行脚本时,我只返回print语句:“Process$t_Process is matched!it running?…”。有人能提供一些指导吗 use strict; use warnings;

全部,

我试图grep一个特定的进程,该进程的输出中包含列出的路径(显示在@t_进程数组中)。默认情况下,计数将始终为1,因为用于grep的命令也将显示在输出中。因此,我使用的是,如果计数大于1,那么它确实正在运行。当我grep它们时,所有这些进程都启动了,并且至少有两个结果返回到命令行。但是,当我运行脚本时,我只返回print语句:“Process$t_Process is matched!it running?…”。有人能提供一些指导吗

use strict;
use warnings;


sub main
{

my @t_processes = (
'/hosting/configs/tomcat7/prod-06_fc' ,
'/hosting/configs/tomcat7/prod-07_fc',
'/hosting/configs/tomcat7/prod-07',
'/hosting/configs/apache22/prod-06_fc/',
'/hosting/configs/jboss6/jb-prod-06'
);

foreach
    my $t_process(@t_processes)
{
    my $match_count = 0;
    if(`ps -aef | grep -i $t_process`) 
    {

        print "Process $t_process is matched! Is it running?....";
        if($match_count > 1)
            {
                print "The process is running\n ";
            }   
        else
            {
                $match_count++
            }                           

    }
    else 
    {
        print "The process $t_process is not running, please start it!\n" ;
    }


}

}


main();

您的grep-if条件总是成功的,因为grep本身产生一个结果,因此if条件总是满足的

试着跑步

if(`ps -aef | grep -i $t_process | grep -v grep`)

您的grep-if条件总是成功的,因为grep本身产生一个结果,因此if条件总是满足的

试着跑步

if(`ps -aef | grep -i $t_process | grep -v grep`)

正如我在评论你的OP时所说,你的
$match\u count
逻辑存在致命缺陷。首先,在
for()
循环中声明它,这将在每个进程上将其重置为零。第二,除非稍后在
else()
语句中,否则永远不会为其赋值;到那时,你就要跳出圈套了

这里有一个更简单的方法:

use strict;
use warnings;

my @t_processes = qw(nginx blah);

for my $t_process(@t_processes){
    if(`ps -aef | grep -i $t_process | grep -v grep`){
        print "$t_process is running\n";
        next;
    }
    print "$t_process is not running, please start it!\n" ;
}
输出:

nginx is running
blah is not running, please start it!

正如我在评论你的OP时所说,你的
$match\u count
逻辑存在致命缺陷。首先,在
for()
循环中声明它,这将在每个进程上将其重置为零。第二,除非稍后在
else()
语句中,否则永远不会为其赋值;到那时,你就要跳出圈套了

这里有一个更简单的方法:

use strict;
use warnings;

my @t_processes = qw(nginx blah);

for my $t_process(@t_processes){
    if(`ps -aef | grep -i $t_process | grep -v grep`){
        print "$t_process is running\n";
        next;
    }
    print "$t_process is not running, please start it!\n" ;
}
输出:

nginx is running
blah is not running, please start it!

你的逻辑有致命的缺陷
$match\u count
永远不会超过零,因为在每次
for()
循环开始时都会重置它。不仅如此,当你检查它是否大于1(它不能大于1)时,它是零,然后进入
else()
++
它,但是没有任何东西会看到增加的值,因为你只是在那之后开始下一个循环。你的逻辑有致命的缺陷
$match\u count
永远不会超过零,因为在每次
for()
循环开始时都会重置它。不仅如此,当您检查它是否大于1(它不能大于1)时,它是零,然后进入
else()
++
它,但是没有任何东西会看到增加的值,因为您只是在那之后开始下一个循环。