![使用正则表达式查看 UNIX 进程是否已启动](https://linux22.com/image/41823/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9F%A5%E7%9C%8B%20UNIX%20%E8%BF%9B%E7%A8%8B%E6%98%AF%E5%90%A6%E5%B7%B2%E5%90%AF%E5%8A%A8.png)
在 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
打印与兼容正则表达式匹配的所有进程(除自身之外)的 PID 列表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
变体,您可以:
设置“$checkProc =
psg dtllst | grep 'dtllst $myNode'
;”然后测试是否$checkProc
非空,或者设置“$checkProc =
psg dtllst
;”然后将其与m/dtllst $myNode/
使用过程::进程表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