我尝试使用ps
来获取进程计数,当我在Linux终端上执行命令时,它返回正确的计数。
但是,当我使用os.popen()
在python shell中执行同一命令时,返回的计数总是增加one
root@dev:/home/admin# ps -ef | grep some_process | wc -l
1
root@dev:/home/admin# python
Python 2.7.6 (default, Nov 23 2017, 15:49:48)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.popen('ps -ef | grep some_process | wc -l').read()
'2\n'
>>>
答案 0 :(得分:1)
os.popen
将启动过程/bin/sh -c 'ps -ef | grep some_precess | wc -l'
,该过程也将被视为符合您条件的过程。
相反,请尝试从shell和python尝试使用cmd ps -ef | grep some_process | grep -v grep | wc -l
,以免您无意中计算了这个启动的进程
答案 1 :(得分:1)
首先,让我们检查一下os.popen('ps -ef | grep some_process | wc -l').read()
的作用。它产生一个外壳,在其参数列表中带有给定的命令行。然后产生了一个由三个进程组成的管道,其中ps
收集了进程列表。此时,至少第一个外壳程序和grep
在其参数列表中具有some_process
;如果尚未exec
引出wc
,则可能也是第三个管道过程。 grep
过滤列表,而wc
对结果进行计数。请注意,即使在清单中grep
都找不到参数的唯一原因是使用-f
,这可能是多余的,因为wc
无关紧要。
这应该清楚说明为什么有人建议[s]ome_process
;此模式本身不匹配,并且会排除所有这2-3个进程,假设glob不起作用。如果碰巧存在一个名为some_process
的文件,则需要使用引号将其工作。
但是,可能有更可靠的方法。我们已经在运行Python进程,因此我们可以轻松地计算事物,ps
可以选择特定的进程,例如ps -C some_process
可以选择命令名称。因此,任务的一种更具区分性的形式可能是:
subprocess.check_output(["ps", "--no-heading", "-C", "python"]).count(b'\n')
使用ps
检查其他相关命令开关,例如man
。