如何在python

时间:2015-05-10 21:59:18

标签: python

的输出
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(最近一次调用最后一次):文件“”,第1行,in      文件“/usr/lib64/python2.7/subprocess.py”,第573行,in   check_output       引发CalledProcessError(retcode,cmd,output = output)subprocess.CalledProcessError:命令'ps uaxw | egrep'kmns'| grep   -v'grep''返回非零退出状态1

我如何解决这个问题?

顺便说一句,这是我编写的用于检测我的系统是否正忙的功能(这意味着如果cpus的数量>总安装量,如果加载avg>每个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。

有什么建议吗?

非常感谢!

2 个答案:

答案 0 :(得分:5)

如果您要使用大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中的行来使这更复杂,但为什么呢?

或者,为什么甚至涉及壳?您可以像在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') 向您提供一大堆您不想要的信息,然后弄清楚如何忽略它,只是要求提供信息你想要的:

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

或者,更简单一点,安装psutil,甚至不要尝试运行子进程并解析其输出:

{{1}}

答案 1 :(得分:1)

如果你想模拟管道,你可以使用Popen:

p1 = Popen(["ps", "uaxw"], stdout=PIPE)
p2 = Popen(["grep", 'kms'], stdout=PIPE, stdin=p1.stdout)
p1.stdout.close()

out,_ = p2.communicate()
print(len(out.splitlines()))

如果可用,请使用pgrep

count  = check_output(["pgrep", "-c", "kms"])

你可能从两者获得不同的输出,因为pgrep只获取可执行文件的名称,但ps -aux vs ps -a也是如此。