如何使用python可靠地解析命令zpool status和zpool list的输出,然后将所有信息插入到mysql数据库中?

时间:2015-08-12 05:11:41

标签: python mysql python-2.7 parsing command-line

我知道的冗长问题。指南说要问一个可以回答的问题,虽然我知道如果我们不小心,这可以转化为讨论。所以一般的方法和循环定义可能足以回答这个问题......虽然如果有代码我不会抱怨。

实现zpool status的输出确实很复杂......我知道它在PHP和VB中是可行的,我如何真正在python中实现它?一个问题,对于每个循环似乎都不适用于从linux命令行返回的字符串。

信息: 操作系统:CentOS Python:2.6.6 ..尝试升级到2.7 mysql DB

数据库关系: 是复杂的,有些专有,但我可以这样说:4个表用于池,Vdevs,子Vdevs和硬盘都是关系。

当前的Python,不是很好

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mdb
import sys
import os
import subprocess

try:

    def get_cols(column_num):
        col_return = [os.system("zpool list | awk '{print$%d}'" % column_num)]
        return col_return

    for line in get_cols(0):
        pool_name = get_cols(1)
        size =  get_cols(2)
        alloc = get_cols(3) 
        free = get_cols(4) 
        print(pool_name + size + alloc + free)
    x = subprocess.Popen(['zpool list'])
    print(x)

except mdb.Error, e:

    print "Error %d: %s" % (e.args[0],e.args[1])
    sys.exit(1)

当前错误

  

Traceback(最近一次调用最后一次):文件   " /var/www/html/pythonscripts/BH_startup.py" ;,第21行,在       x = subprocess.Popen([' zpool list'])文件" /usr/lib64/python2.6/subprocess.py",第642行, init       errread,errwrite)文件" /usr/lib64/python2.6/subprocess.py",第1238行,在_execute_child中       raise child_exception OSError:[Errno 2]没有这样的文件或目录

2 个答案:

答案 0 :(得分:0)

x = subprocess.Popen(['zpool list'])

应该是

x = subprocess.Popen(['zpool', 'list'])

答案 1 :(得分:0)

您将必须解析命令的输出以提取任何必要的信息。 在这种情况下,我们要查找ZFS池的状态:

ZFS_Pool_name = "ZFS Pool name"
cmd = ['sudo', 'zpool', 'status', ZFS_Pool_name]
ps_proc = subprocess.Popen(command, stdout=subprocess.PIPE,
                               close_fds=True)
output, err = ps_proc.communicate()  
for entry in map(lambda x: x.strip(), result.split('\n')):
    if "state" in entry:
        pool_status = entry.split(" ")[-1]
        # Insert this pool_status to wherever you want