python中的传递值grep命令

python中的传递值grep命令,grep,parameter-passing,Grep,Parameter Passing,我通过在Linux Debian 7机器上的Python脚本中运行以下命令,获取openvpn进程的CPU和RAM统计数据 >ps aux | grep openvpn 分析输出并将其发送到zabbix监控服务器 我目前使用以下名为psperf.py的Python脚本 如果我想要CPU%stats,我运行:psperf 2 >#!/usr/bin/env python > >import subprocess, sys, shlex > >psval=sys

我通过在Linux Debian 7机器上的Python脚本中运行以下命令,获取openvpn进程的CPU和RAM统计数据

>ps aux | grep openvpn
分析输出并将其发送到zabbix监控服务器

我目前使用以下名为psperf.py的Python脚本

如果我想要CPU%stats,我运行:psperf 2

>#!/usr/bin/env python
>
>import subprocess, sys, shlex
>
>psval=sys.argv[1] #ps aux val to extract such as CPU etc #2 = %CPU, 3 = %MEM, 4 = VSZ, 5 = RSS
>
>#https://stackoverflow.com/questions/6780035/python-how-to-run-ps-cax-grep-something-in-python
>proc1 = subprocess.Popen(shlex.split('ps aux'),stdout=subprocess.PIPE)
>proc2 = subprocess.Popen(shlex.split('grep  >openvpn'),stdin=proc1.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>
>proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
>out,err=proc2.communicate()
>
>#string stdout?
>output = (format(out))
>
>#create output list
>output = output.split()
>  
>#make ps val an integer to enable list location
>psval = int(psval)
>
>#extract value to send to zabbix from output list
>val = output[psval]
>
>#OUTPUT
>print val
该脚本可以很好地获取与openvpn相关的数据。但是,我现在希望通过传递流程细节来重用脚本,从中提取数据,而不必为每个单独的流程编写脚本。例如,我可能需要zabbix进程的CPU和RAM统计数据

我尝试了各种解决方案,包括以下解决方案,但得到的索引超出了范围

例如,我运行:psperf 2 apache

>#!/usr/bin/env python
>
>import subprocess, sys, shlex
>
>psval=sys.argv[1] #ps aux val to extract such as CPU etc #2 = %CPU, 3 = %MEM, 4 = VSZ, 5 = RSS
>psname=sys.argv[2] #process details/name
>
>#https://stackoverflow.com/questions/6780035/python-how-to-run-ps-cax-grep-something-in-python
>proc1 = subprocess.Popen(shlex.split('ps aux'),stdout=subprocess.PIPE)
>proc2 = subprocess.Popen(shlex.split('grep', >psname),stdin=proc1.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>
>proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
>out,err=proc2.communicate()
>
>#string stdout?
>output = (format(out))
>
>#create output list
>output = output.split()
>
>#make ps val an integer to enable list location
>psval = int(psval)
>
>#extract value to send to zabbix from output list
>val = output[psval]
>
>#OUTPUT
>print val
错误:

>root@Deb764opVPN:~# python /usr/share/zabbix/externalscripts/psperf.py 4 openvpn
>Traceback (most recent call last):
>  File "/usr/share/zabbix/externalscripts/psperf.py", line 25, in <module>
>    val = output[psval]
>IndexError: list index out of range
>root@Deb764opVPN:~#python/usr/share/zabbix/externalscripts/psperf.py 4 openvpn
>回溯(最近一次呼叫最后一次):
>文件“/usr/share/zabbix/externalscripts/psperf.py”,第25行,在
>val=输出[psval]
>索引器:列表索引超出范围
在过去,我没有使用对我来说是新的shlex类。这对于通过管道将ps aux命令安全地传输到grep是必要的-避免shell=true-安全隐患()

我采用的剧本来自:

我相信这与shlex如何处理我的请求有关,但我不确定如何继续

你能帮忙吗?如如何成功地将值传递给grep命令

我可以看到,这对其他许多使用管道命令的人来说是有益的

问候


艾丹

我用以下方法进行了研究和解决:

!/usr/bin/env python 导入子流程,sys#,shlex

psval=sys.argv[1]#要提取的ps辅助值,如CPU等#2=%CPU,3=%MEM,4=VSZ,5=RSS psname=sys.argv[2]#流程详细信息/名称

#http://www.cyberciti.biz/tips/grepping-ps-output-without-getting-grep.html
proc1 = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['grep', psname], stdin=proc1.stdout,stdout=subprocess.PIPE)

proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.

stripres = proc2.stdout.read()

#TEST RESULT
print stripres

#create output list
output = stripres.split()

#make ps val an integer to enable list location
psval = int(psval)

#extract value to send to zabbix from output list
val = output[psval]

#OUTPUT
print val
问候

艾丹