如何检查Unix进程是否在Perl中运行?
在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变量。
我在这里错过了什么?我知道我的正则表达式是错误的地方:(
感谢
添加到@ zigdon的回答是:
比方说你$myNode
是foo
,你的正则表达式将/dtllst foo | foo/
现在这个搜索字符串'dtllst foo '
或' foo'
in $checkProc
。
请注意,在'foo'
之后之后有一个空格。该字符串唯一可以找到的地方是最后一列CMD
,但尾随空格将导致匹配失败。
另外你的替代品' foo'
也有一个空间。如果找到该过程的唯一方法是搜索'dtllst foo'
,则不需要此替代方案,因为此替代方案也将匹配'foo'
作为其他命令的参数运行。
而正则表达式是:
if ($checkProc =~ m/dtllst $myNode/) {
你也许匹配grep的进程?您始终可以添加| grep -v grep
以确保您正在筛选ps
输出中的那条线。
您可以使用Proc::ProcessTable来避免必须启动外部命令并解析其输出。类似于
use Proc::ProcessTable;
...
my $t = Proc::ProcessTable->new;
my $is_running = grep { $_->{cmndline} =~ /^dtllst $myNode/ } @{$t->table};
我想我知道为什么会这样发生。您的代码始终评估为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";
}
你可以使用kill命令,似乎是一种更干净的方式;
#!/usr/bin/perl
#-- check if process 11325 is running
$exists = kill 0, 11325;
print "Process is running\n" if ($exists);
不错的纯perl版本。谢谢! – 2016-12-08 15:12:39
注意:这只有在你可以杀死进程(你是它的主人或你是root)时才有效。 – 2017-02-28 03:08:03
我们不知道你的'psg'别名或shell函数是什么。我们看到你的''$ checkProc = ...'行中有反引号,这可能是一个语法错误。我们看到你将'psg'管入'grep'中,如果'psg'已经是包含grep的别名,这对我没有任何意义。重要的是,我们不知道'$ checkProc'和'$ myNode'的内容 - 如果'$ myNode'为空,那么你的正则表达式将会匹配任何一个空格字符,这可以解释你的症状。 – pilcrow 2010-10-02 14:00:36