2014-09-30 12 views
5

Jak wykonać iterację punktów montowania systemu Linux za pomocą języka Python? Wiem, że mogę to zrobić za pomocą polecenia df, ale czy jest w tym wbudowana funkcja Pythona?Iterowanie za pomocą punktów podłączenia za pomocą Pythona

Ponadto, piszę skrypt w języku Python, aby monitorować wykorzystanie punktów instalacji i wysyłać powiadomienia e-mail. Czy byłoby lepiej/szybciej zrobić to jako zwykły skrypt powłoki w porównaniu ze skryptem w Pythonie?

Dzięki.

+0

Zależy. Co masz na myśli przez "monitor"? Jeśli chcesz po prostu wysłać wiadomość e-mail, gdy coś się zmieni, będzie to bardzo łatwe w bash, ale jeśli chcesz czegoś bardziej skomplikowanego, szybko zorientujesz się, że python jest do zrobienia. – ventsyv

+0

Przykro mi, miałem na myśli napisanie zadania cron, które sprawdza miejsce zajmowane we wszystkich punktach montowania i wysyła wiadomość e-mail, jeśli osiągnie określony próg. – drunkenfist

+0

Dlaczego nie używać obu? @ventsyv, słusznie zauważył, bash byłby bardzo łatwy do uzyskania dostępu do plików w systemie Linux. Wysyłanie powiadomień pocztą e-mail można również wykonać za pomocą bash, ale można to zrobić bez wysiłku w pythonie i można utworzyć prosty skrypt bash, aby połączyć te skrypty. –

Odpowiedz

1

nie wiem o wszelkich biblioteki, która robi to, ale może po prostu uruchomić mount i zwrócić wszystkie punkty montowania w postaci listy z czymś takim:

import commands 

mount = commands.getoutput('mount -v') 
mntlines = mount.split('\n') 
mntpoints = map(lambda line: line.split()[2], mntlines) 

Kod pobiera cały tekst z mount -v polecenie, dzieli dane wyjściowe na listę linii, a następnie analizuje każdą linię dla trzeciego pola reprezentującego ścieżkę punktu montowania.

Jeśli chcesz użyć df następnie można to zrobić też, ale trzeba usunąć pierwszy wiersz, który zawiera nazwy kolumn:

import commands 

mount = commands.getoutput('df') 
mntlines = mount.split('\n')[1::] # [1::] trims the first line (column names) 
mntpoints = map(lambda line: line.split()[5], mntlines) 

Gdy masz punkty montowania (mntpoints lista) można użyć for in przetworzyć każdy z kodu:

for mount in mntpoints: 
    # Process each mount here. For an example we just print each 
    print(mount) 

Python posiada moduł przetwarzania poczty elektronicznej o nazwie smtplib i można znaleźć informacje w Python docs

+0

Dzięki Michael. Czy polecenie commands.getoutput jest lepsze niż Subprocess.popen, jeśli chcę przeprowadzić iterację wyniku polecenia powłoki? – drunkenfist

+0

Dla czegoś podobnego uważam getoutput bardziej wygodne, jeśli chcesz przekierować wyjście stdin i stdout do ciągu. Subprocess.popen pozwala ci zrobić o wiele więcej dzięki Pipes.Jeśli potrzebujesz dokładniejszej kontroli przekierowania, 'getoutput' nie jest zbyt dużą opcją. 'getoutput' specyficznie zwraca wszystko ze stdin i stderr i zrzuca go na ciąg (w tym przypadku ciąg' mount'). Bardzo wygodne, jeśli wszystko, czego chcesz, to całe wyjście w jednym dużym tekście. Możesz użyć 'Subprocess.popen', aby wykonać to samo zadanie z dodatkowym kodem. –

1

Sposób bash to zrobić, po prostu dla zabawy:

awk '{print $2}' /proc/mounts | df -h | mail -s `date +%Y-%m-%d` "[email protected]" 
+0

'open ('/ proc/mounts'). Read()' jest początkiem dla Pythona. (Awesome answer btw) – temoto

1

Uruchamianie komendy mount od wewnątrz Python nie jest to najbardziej efektywny sposób, aby rozwiązać problem. Można zastosować odpowiedź Khalid i wdrożyć go w czystym Pythonie:

with open('/proc/mounts','r') as f: 
    mounts = [line.split()[1] for line in f.readlines()]   

import smtplib 
import email.mime.text 

msg = email.mime.text.MIMEText('\n'.join(mounts)) 
msg['Subject'] = <subject> 
msg['From'] = <sender> 
msg['To'] = <recipient> 

s = smtplib.SMTP('localhost') # replace 'localhost' will mail exchange host if necessary 
s.sendmail(<sender>, <recipient>, msg.as_string()) 
s.quit() 

gdzie <subject>, <sender> i <recipient> powinny zostać zastąpione przez odpowiednie ciągi.

+0

Może nie być najbardziej wydajnym, jednak/proc/mounts nie istnieje w BSD. OP używa Linuksa, ale osobiście używam mounta, by celować w większą różnorodność systemów operacyjnych. –

+1

To prawda, ale OP w szczególności wspomina o Linuksie. – isedev

+0

Tak, od razu zaktualizowałem swój komentarz, został on przechwycony przed zapisaniem mojej edycji. Masz rację./proc/mount ma jeden niedobór Linuksa. Jeśli utworzysz środowisko chroot i użyjesz 'mount -o bind' w chroot, to/proc/mounts nie wyświetli żadnego z chrootowanych mountów. Jednak polecenie mount (w chroot) będzie. 'df' też nie, dlatego moim preferowanym jest uruchomienie' mount'. –

14

Python i wieloplatformowy sposobem:

pip install psutil # or add it to your setup.py's install_requires 

A potem:

import psutil 
partitions = psutil.disk_partitions() 

for p in partitions: 
    print p.mountpoint, psutil.disk_usage(p.mountpoint).percent 
+1

'psutil' to świetny pakiet do uzyskiwania informacji o systemie, który działa na wszystkich głównych platformach i zasługuje na bycie lepiej znanym. –

+0

w szczególności, rzeczy takie jak '/ proc' nie pojawiają się w tym narzędziu – ThorSummoner

Powiązane problemy