2010-10-02 73 views
3

在UNIX中,我正在通过执行以下命令来检查进程是否已启动;如何检查Unix进程是否在Perl中运行?

E.g.

psg dtllst pe99 

如果进程正在运行,则返回以下输出;

UID PID PPID C STIME TTY TIME CMD 
pe99 1234 1  0 03:29:44 pts/8 0:01 dtllst pe99 

现在在Perl中,我想能够找出这个过程是否启动。到目前为止,我做了以下

`my $checkProc = `psg dttlst | grep $myNode 2>&1`;` #where $myNode is something like pe01 or pe02 or pe65 or pe99 etc... 

在此之后现在我做以下,看看上面的Perl命令已经回到我所期待的,看看这个过程是向上;

if ($checkProc =~ m/dtllst $myNode | $myNode/) { 
    #yes, process is up 
} else { 
    #no, process is down 
} 

但是这不起作用 - 具体地说,无论UNIX进程是否存在,我的代码总是评估if语句为true。我知道这是错误的。 我试图逃避正则表达式中的“$”字符,看看是否是这个问题,我也尝试从正则表达式中删除Perl变量。

我在这里错过了什么?我知道我的正则表达式是错误的地方:(

感谢

+2

我们不知道你的'psg'别名或shell函数是什么。我们看到你的''$ checkProc = ...'行中有反引号,这可能是一个语法错误。我们看到你将'psg'管入'grep'中,如果'psg'已经是包含grep的别名,这对我没有任何意义。重要的是,我们不知道'$ checkProc'和'$ myNode'的内容 - 如果'$ myNode'为空,那么你的正则表达式将会匹配任何一个空格字符,这可以解释你的症状。 – pilcrow 2010-10-02 14:00:36

回答

1

添加到@ zigdon的回答是:

比方说你$myNodefoo,你的正则表达式将/dtllst foo | foo/

现在这个搜索字符串'dtllst foo '' foo' in $checkProc

请注意,在'foo'之后之后有一个空格。该字符串唯一可以找到的地方是最后一列CMD,但尾随空格将导致匹配失败。

另外你的替代品' foo'也有一个空间。如果找到该过程的唯一方法是搜索'dtllst foo',则不需要此替代方案,因为此替代方案也将匹配'foo'作为其他命令的参数运行。

而正则表达式是:

if ($checkProc =~ m/dtllst $myNode/) { 
6

你也许匹配grep的进程?您始终可以添加| grep -v grep以确保您正在筛选ps输出中的那条线。

9

您可以使用Proc::ProcessTable来避免必须启动外部命令并解析其输出。类似于

use Proc::ProcessTable; 
... 
my $t = Proc::ProcessTable->new; 
my $is_running = grep { $_->{cmndline} =~ /^dtllst $myNode/ } @{$t->table}; 
1

我想我知道为什么会这样发生。您的代码始终评估为true,因为带有您正在使用的模式的psg命令也会出现在从Perl脚本中调用该命令时psg命令输出的进程列表中。如果不在if条件中执行匹配以确定进程是否正在运行,则可能需要保留匹配计数,并在匹配计数超过1时处理与匹配模式的进程正在运行。以下是我使用的一段代码:

my $match_count = 0; 
my $processes = `ps x`; 
while($processes =~ m/(.*?)\n/sg) 
{ 
    my $process = $1; 
    chomp($process); 
    if($process =~ m/$pattern/) 
    { 
     #print "$process matched $pattern \n"; 
     $match_count++; 
    } 
} 

if($match_count > 1) 
{ 
    print "The process is running"; 
} 
3

你可以使用kill命令,似乎是一种更干净的方式;

#!/usr/bin/perl 

#-- check if process 11325 is running 
$exists = kill 0, 11325; 
print "Process is running\n" if ($exists); 
+0

不错的纯perl版本。谢谢! – 2016-12-08 15:12:39

+1

注意:这只有在你可以杀死进程(你是它的主人或你是root)时才有效。 – 2017-02-28 03:08:03

相关问题