Python脚本,用于验证Linux的磁盘空间输出

时间:2016-01-17 19:35:49

标签: python arrays linux 2d

我是python中的初学者,我正在编写一个python脚本来验证每个挂载点的利用率是否高于阈值。我可以调用shell命令并将输出保存到变量中。但是我无法使用变量来分割字段,检查利用率是否高于阈值并报告错误

/dev/mapper/system-root     20G   18G  1.4G  93% /
udev                       3.9G  248K  3.9G   1% /dev
tmpfs                      3.9G   68K  3.9G   1% /dev/shm
/dev/sda1                  251M   71M  167M  30% /boot
/dev/mapper/system-oracle  128G   43G   79G  36% /opt/app/oracle
/dev/mapper/system-tmp     5.5G  677M  4.5G  13% /tmp
/dev/mapper/system-log     3.0G  140M  2.7G   5% /var/log
/dev/mapper/system-varsog   20G  654M   19G   4% /var/sog
/dev/mapper/system-backup   50G   24G   24G  50% /var/sog/backups

我想将字段5和字段6存储在关联数组中,并使用阈值验证字段5,并报告它是否高于阈值。

我使用下面的脚本来存储shell命令输出,现在我需要通过拆分它的字段进行处理,但我无法将它存储在数组中,因为它是多维的,所以我是否应该使用For Loop来存储不同的阵列。

在shell,awk和perl中很容易做到但是python似乎很难。

>>> import sys, os, time, threading, subprocess,datetime
>>> diskinfo_raw = subprocess.Popen("df -h", shell=True,stdout=subprocess.PIPE)
>>> output = diskinfo_raw.communicate()[0]
>>> print output

请帮我一个想法或参考。我已经使用loadtxt选项探索了选项,但我不想将值存储在文件中并再次读取它。

5 个答案:

答案 0 :(得分:1)

WSO2 API Manager用于数据源:

df -h

答案 1 :(得分:1)

您可以执行类似

的操作
mount_usage = {line.split()[5]: line.split()[4] for line in output.split('\n')}

将给出一个字典,其中key是挂载点,值是使用率。

{'/': '93%', '/dev/shm': '1%', '/dev': '1%', '/boot': '30%', '/tmp': '13%', '/var/sog/backups': '50%', '/opt/app/oracle': '36%', '/var/log': '5%', '/var/sog': '4%'}

答案 2 :(得分:0)

作为一个单行:

dict((fields[5], fields[4]) for fields in [line.split() for line in output.strip().split("\n")][1:])

扩大并解释:

usage = dict()  # Dictionaries are Python's associative arrays
for line in output.strip().split("\n")[1:]: # Get the lines with actual data
    fields = line.split()  # Break the line into fields
    usage[fields[5]] = fields[4]  # Map mount point to usage

答案 3 :(得分:0)

你可以试试这个:

>>> import subprocess
>>> threshold = 10
>>> child = subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE)
>>> output = child.communicate()[0].strip().split("\n")
>>> for x in output[1:]:
...     if int(x.split()[-2][:-1]) >= threshold:
...         print x

这将列出磁盘使用率为10%或超过10%的所有文件系统

答案 4 :(得分:-1)

新的“子流程”模型包含很多控制权来获取外部命令的输出,但需要付出代价:它变得官僚主义。

对于快速脚本,旧方法仍然有效:

>>> import os                                                                                                                                                                     
>>> du = os.popen("df -h").readlines()
>>>      

>>> from pprint import pprint
>>> pprint(du)
['Filesystem      Size  Used Avail Use% Mounted on\n',
 'devtmpfs        7,7G     0  7,7G   0% /dev\n',
 'tmpfs           7,8G  164M  7,6G   3% /dev/shm\n',
 'tmpfs           7,8G  1,2M  7,8G   1% /run\n',
 'tmpfs           7,8G     0  7,8G   0% /sys/fs/cgroup\n',
 '/dev/sda6        24G   12G   12G  51% /\n',
 'tmpfs           7,8G   16K  7,8G   1% /tmp\n',
 '/dev/sda5        24G   19G  4,1G  83% /var\n',
 '/dev/sda3       147G   28G  119G  20% /opt\n',
 '/dev/sda2       391G  313G   79G  81% /home\n',
 'tmpfs           1,6G   20K  1,6G   1% /run/user/1000\n']

新的子进程模块还包含一些快捷方式,可以在不经过所有参数subprocess的情况下获取程序的输出.Popen需要:

>>> pprint(subprocess.check_output("df -h".split()).split("\n"))
['Filesystem      Size  Used Avail Use% Mounted on',
 'devtmpfs        7,7G     0  7,7G   0% /dev',
 ...

因此,正如您所看到的,除了check_output之外,子进程还具有Popen函数,默认情况下会读取外部进程的所有输出并将其作为单个字符串返回。

调用的问题在于子进程模型要求外部进程的不同参数是列表的元素(并且程序名称作为参数)。因此,它需要subprocess.check_output(["df", "-h"]) - 我在上面用“df -h”命令行中的“split”替换,我通常在我的代码中这样做。