如何观看 pgrep?

如何观看 pgrep?

当使用它运行pgrep命令时watch,不仅显示实际的 pgrep 输出,还显示进程watch

例子:

watch pgrep -lf donothing

虽然会显示 3 个进程

pgrep -lf donothing

没有显示一个。你是否有一种优雅的方式来正确处理这个问题而不watch显示自己的的过程watch

编辑

使用帕特里克的建议:

watch pgrep -f '^python donothing.py'

显示我的用法pgrep(每 2 秒更新一次...)

watch pgrep -l 'python donothing.py'

以及(这些pgrep命令单独起作用,但不能与 结合使用watch)。

watch "pgrep 'python donothing.py'"

虽然进程在那里,但没有显示任何内容。

答案1

从你的评论来看,你应该做pgrep donothing.pypgrep -x donothing.py

使用时,pgrep -f它会查找名称和/或参数中具有匹配字符串的任何命令。没有很好的方法来过滤结果。解决方案是完全匹配您所追求的内容,因此匹配进程名称。
pgrep默认情况下仅匹配进程名称。默认情况下,它将搜索名称包含匹配字符串的任何进程。它将-x搜索名称与字符串完全匹配的任何进程。

pgrep也足够聪明,能够理解脚本。如果您有一个名为 的脚本foo.sh,它将显示为psas /bin/sh foo.sh(或类似的内容)。在这种情况下,pgrep将比较脚本名称。所以你可以做pgrep foo.shpgrep -x foo.sh

因此,就您而言,您应该努力pgrep -x donothing.py获得完全匹配。

编辑:
我应该注意,这仅在脚本作为/path/to/donothing.py.如果你启动它,python donothing.py它将不起作用。

在这种情况下,您需要使用正则表达式,例如pgrep -f '^python donothing.py'.

EDIT2:
您遇到的问题watch是引用。 running不带参数watch pgrep -f '^python donothing.py'运行。pgrep-f '^python donothing.py'作为参数传递给 的watch,而不是pgrep按预期传递。整个 pgrep 命令应该被引用。

watch "pgrep -f '^python donothing.py'"

作为另一个注释。如果您打算将其用于其他用途,那么这样做可能会更安全

watch "pgrep -f '(^|\S+/)python donothing.py'"

这将捕捉到进程显示为类似于/usr/bin/python而不是仅仅的情况python

相关内容