2016-01-17 4 views
1

Я начинающий на питоне, я пишу скрипт python, чтобы проверить, что использование каждой точки монтирования выше порога или нет. Я могу вызвать команду оболочки и сохранить вывод в переменной. Но я не могу использовать переменную для разделения полей, проверить использование выше порогового значения и отчет о неисправностяхСценарий Python для проверки вывода на диск из Linux

/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 с порогом и сообщением, если оно превышает пороговое значение.

Я использовал ниже сценарий для хранения вывода команды оболочки, и теперь мне нужно обработать, разделив его поля, но я не могу его хранить в массиве, поскольку он многомерен. Поэтому мне нужно использовать For Loop для хранения в другой массив.

Это очень легко сделать в оболочке, 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, но я не хочу хранить значения в файле и снова читать его.

+0

Это может быть хорошим началом, чтобы не добавить '- h' (правдоподобный) аргумент команде, чтобы получить более легкий для анализа вывода. –

+0

'os.statvfs' используется в одном из ответов здесь, http://stackoverflow.com/a/31856769/5781248 –

+0

Существует также межплатформенная библиотека, http://pythonhosted.org/psutil/ и' shutil.disk_usage' в версиях python 3.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%

+0

Спасибо, что это результат, которого я ожидал. Там много больше, чтобы узнать и внести свой вклад и поддержать, как и вы. –

+0

@MullaiArasu благодарит в любое время , да, гораздо больше, чтобы учиться. наслаждаться – Hackaholic

-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"]), который я заменил выше, используя «split» в командной строке «df -h», как это обычно бывает в моем коде.

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 
+0

Skyler ваша помощь очень ценится :) Это больше, чем больше людей помогают новичкам, как и мы. –

1

Использование df -h для источника данных:

import re 

d = {} 
lines = output.split('\n') 
next(lines) # skip headers 
for line in lines: 
    usage, mount = re.split('\s+', line)[4:] 
    d[usage] = mount 
1

Вы могли бы сделать что-то вроде

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

, который даст словарь с ключом, являющимся точкой монтирования, и значением является доля использования.

{'/': '93%', '/dev/shm': '1%', '/dev': '1%', '/boot': '30%', '/tmp': '13%', '/var/sog/backups': '50%', '/opt/app/oracle': '36%', '/var/log': '5%', '/var/sog': '4%'} 
Смежные вопросы