当使用它运行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.py
或pgrep -x donothing.py
。
使用时,pgrep -f
它会查找名称和/或参数中具有匹配字符串的任何命令。没有很好的方法来过滤结果。解决方案是完全匹配您所追求的内容,因此匹配进程名称。
pgrep
默认情况下仅匹配进程名称。默认情况下,它将搜索名称包含匹配字符串的任何进程。它将-x
搜索名称与字符串完全匹配的任何进程。
pgrep
也足够聪明,能够理解脚本。如果您有一个名为 的脚本foo.sh
,它将显示为ps
as /bin/sh foo.sh
(或类似的内容)。在这种情况下,pgrep
将比较脚本名称。所以你可以做pgrep foo.sh
或pgrep -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
。