使用正则表达式查看 UNIX 进程是否已启动

使用正则表达式查看 UNIX 进程是否已启动

在 UNIX 中,我通过执行以下命令来检查进程是否已启动;

例如

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 变量。

我在这里缺少什么?我知道我的正则表达式在某个地方是错误的:(

谢谢

答案1

该命令pgrep打印与兼容正则表达式匹配的所有进程(除自身之外)的 PI​​D 列表grep

如果没有匹配项,它不会打印任何内容。

这应该是一个足够的测试:[ $(pgrep process | wc) -gt 0 ]如果进程正在运行,则为 true。如果没有则为假。

答案2

我不熟悉psg,但我知道(可以这么说,这是一个困难的方法)如果我运行ps ax | grep progname查看是否有任何进程正在运行包含progname,我总是会得到肯定的答案,因为grep progname它本身就是一个包含“progname”的命令。

我不知道 perl,但在 bash 中,我可以这样解决这个问题,例如,如果我想检查 progname 的任何实例是否正在运行,我运行ps ax | grep -c "[p]rogname",这解决了总是得到“是”的问题。

答案3

您的正则表达式m/dtllst $myNode | $myNode/将匹配(特别是)任何出现的$myNode.通过构造,psg dtllst | grep $myNode将返回匹配的内容$myNode,因此您的正则表达式始终匹配。

如果您无法遵循其他人的建议并使用pgrep或其ps ... | grep变体,您可以:

  1. 设置“$checkProc = psg dtllst | grep 'dtllst $myNode';”然后测试是否$checkProc非空,或者

  2. 设置“$checkProc = psg dtllst;”然后将其与m/dtllst $myNode/

  3. 使用过程::进程表CPAN 模块,只需搜索一个条目$p即可$p->cmdline =~ m/dtllst $myNode/

答案4

我不知道这是否是您想要的,但这就是您获取程序 PID 的方法:

ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1

这将输出带有参数的给定命令的所有 PID(如果有)。

如果您愿意,您可以使用它将其通过管道传输到另一个程序中,并且如果您一次需要所有 PID,您可以将整个内容包装在$()

MyPIDs=$(ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1)
echo $MyPIDs

相关内容