的输出
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。
有什么建议吗?
非常感谢!
答案 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也是如此。