0

Linux Debian 7 ボックスの Python スクリプトで次のコマンドを実行して、openvpn プロセスの CPU と RAM の統計情報を取得しています。

>ps aux | grep openvpn

出力は解析され、zabbix 監視サーバーに送信されます。

現在、psperf.py という次の Python スクリプトを使用しています。

CPU% 統計が必要な場合は、次を実行します: 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

過去に、私は新しい shlex クラスを使用していません。これは、ps aux コマンドをパイプして安全に grep するために必要でした - shell = true を回避します - セキュリティ上の問題 ( http://docs.python.org/2/library/subprocess.html )。

次のスクリプトを採用しました: How to run " ps cax | grep something " in Python?

それは、shlex が私の要求を処理する方法に関係していると思いますが、どうすればよいかわかりません。

手伝ってくれますか?どうすればgrepコマンドに値を渡すことができますか。

これは、コマンドなどをパイプする他の多くの人にとって有益であることがわかります。

よろしく

エイダン

4

1 に答える 1