Skip to main content
 首页 » 编程设计

python之如何在python中查找运行特定命令的进程数

2025年05月04日9tintown

输出

ps uaxw | egrep 'kms' | grep -v 'grep' 

产量:

user1  8148  0.0  0.0 128988  3916 pts/8    S+   18:34   0:00 kms  
user2 11782  0.7  0.3 653568 56564 pts/14   Sl+  20:29   0:01 kms 

很明显是两个进程在运行程序。我想将此数字(此处为 2)存储为变量。关于如何在 python 中执行此操作的任何建议?

我尝试了以下方法:

procs = subprocess.check_output("ps uaxw | egrep 'kmns' |grep -v 'grep'",shell=True) 

但我得到以下信息(我认为当作业当前未运行时,因此运行作业的进程数为零):

Traceback (most recent call last): File "", line 1, in File "/usr/lib64/python2.7/subprocess.py", line 573, in check_output raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command 'ps uaxw | egrep 'kmns' |grep -v 'grep'' returned non-zero exit status 1

我该如何解决这个问题?

顺便说一句,这是我编写的函数,用于检测我的系统是否繁忙(这意味着如果 cpus 数量 > 安装总数,并且如果每个 cpu 的平均负载 > 0.9):

def busy(): 
    import subprocess 
    output = subprocess.check_output("uptime", shell=False) 
    words = output.split() 
    sys.stderr.write("%s\n"%(output))  
    procs = subprocess.check_output("ps uaxw | egrep '(kmns)' | grep -v 'grep'", shell=True) 
    kmns_wrds = procs.split("\n") 
    wrds=words[9] 
    ldavg=float(wrds.strip(','))+0.8 
    sys.stderr.write("%s %s\n"%(ldavg,len(kmns_wrds))) 
    return max(ldavg, len(kmns_wrds)) > ncpus 

上面的调用者:

def wait_til_free(myseconds): 
    while busy(): 
        import time 
        import sys 
        time.sleep(myseconds) 
        """ sys.stderr.write("Waiting %s seconds\n"%(myseconds)) """ 

这基本上告诉系统等待所有 cpus 被占用。

有什么建议吗?

非常感谢!

请您参考如下方法:

如果你打算用一个大的 shell 命令来完成这一切,只需添加 -c grep 的参数,因此它会为您提供行数而不是实际行数:

$ ps uaxw |grep python |grep -v grep 
abarnert         1028   0.0  0.3  2529488  55252 s000  S+    9:46PM   0:02.80 /Library/Frameworks/Python.framework/Versions/3.4/Resources/Python.app/Contents/MacOS/Python /Library/Frameworks/Python.framework/Versions/3.4/bin/ipython3 
abarnert         9639   0.0  0.1  2512928  19228 s002  T     3:06PM   0:00.40 /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python /usr/local/bin/ipython2 
$ 
$ ps uaxw |grep python |grep -c -v grep 
2 

当然,你可以通过添加一个 | wc -l 来使它变得更复杂。到最后,或者通过计算 Python 中的行数,但为什么呢?


或者,为什么还要涉及 shell?您可以像运行 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')