如何使用Python在Linux中获取运行进程总数和线程总数?

时间:2019-02-08 12:45:56

标签: python linux process

我能够使用终端命令获得总进程数。 我已经尝试按照以下命令进行进程计数-

ps aux | wc -l

还有线程数-

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END " "{ print num_threads }'

但是我不想使用终端命令,因为它在我当前的项目中是不允许的,是否有任何API或其他方法可以在不调用终端的情况下获取此信息。

我曾尝试使用 threading 包,但它在进程级别显示,我得到的输出为 1

我尝试了 psutil ,但是它提供了单个进程的信息。

其他信息

OS - Ubuntu 16
Python 3.7.2

1 个答案:

答案 0 :(得分:1)

只需尝试一下:

如果要使用一个大的shell命令来完成所有操作,只需将-c参数添加到grep中,这样它就可以为您计算行数,而不是实际行数:

ps uaxw |grep python |grep -v grep

当然,您可以通过添加|将其变得更复杂。 wc -l到最后,或者通过计数Python中的行数,但是为什么呢?

或者,为什么还要涉及外壳呢?您可以像运行grep一样轻松地在Python中搜索-然后就不会出现意外创建了一个grep进程的问题,ps会在匹配搜索时重复该过程,然后需要grep -v将其退出:

procs = subprocess.check_output(['ps', 'uaxw']).splitlines()
kms_procs = [proc for proc in procs if 'kms' in proc]
count = len(kms_procs)

或者,更简单地说,不要要求ps给您一堆您不想要的信息,然后找出如何忽略它的方法,只需询问您想要的信息即可:

procs = subprocess.check_output(['ps', '-a', '-c', '-ocomm=']).splitlines()
count = procs.count('kms')

或者,更简单地说,是安装psutil,甚至不要尝试运行子流程并解析其输出:

count = sum(1 for proc in psutil.process_iter() if proc.name() == 'kms')