Iterando a través de puntos de montaje usando Python

5 minutos de lectura

¿Cómo itero a través de los puntos de montaje de un sistema Linux usando Python? Sé que puedo hacerlo usando el comando df, pero ¿hay una función de Python incorporada para hacer esto?

Además, solo estoy escribiendo un script de Python para monitorear el uso de los puntos de montaje y enviar notificaciones por correo electrónico. ¿Sería mejor/más rápido hacer esto como un script de shell normal en comparación con un script de Python?

Gracias.

  • Depende ¿A qué te refieres con “monitorear”? Si simplemente desea enviar un correo electrónico cuando algo cambia, eso será muy fácil de hacer en bash, pero si desea algo más complicado, encontrará rápidamente que Python es el camino a seguir.

    – ventsyv

    30 de septiembre de 2014 a las 3:57

  • Lo siento, lo que quise decir fue escribir un trabajo cron que verifique el espacio ocupado en todos los puntos de montaje y envíe un correo electrónico si alcanza un cierto umbral.

    – puño Borracho

    30 de septiembre de 2014 a las 4:09

  • ¿Por qué no usar ambos? @ventsyv, señaló correctamente, bash sería muy fácil para acceder a archivos en el sistema Linux. El envío de notificaciones por correo electrónico también se puede hacer usando bash, pero sin embargo se puede hacer sin esfuerzo en python y puede crear un script bash simple para combinar estos scripts.

    –Vivek Pradhan

    30 de septiembre de 2014 a las 4:27

avatar de usuario
michel samia

La forma Python y multiplataforma:

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

Y entonces:

import psutil
partitions = psutil.disk_partitions()

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

  • psutil es un gran paquete para obtener información del sistema que funciona en todas las plataformas principales y merece ser mejor conocido.

    – Davor Cubránico

    11 de abril de 2017 a las 22:15

  • en particular, cosas como /proc no aparecer en esta herramienta

    – ThorSummoner

    29/10/2017 a las 22:53


ejecutando el mount El comando desde Python no es la forma más eficiente de resolver el problema. Puede aplicar la respuesta de Khalid e implementarla en Python puro:

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()

dónde <subject>, <sender> y <recipient> debe ser reemplazado por cadenas apropiadas.

  • Puede que no sea el más eficiente, sin embargo, /proc/mounts no existe en BSD. El OP está usando Linux, sin embargo, personalmente uso mount para apuntar a una variedad más amplia de sistemas operativos.

    -Michael Petch

    30 de septiembre de 2014 a las 12:45


  • Cierto, pero el OP menciona a Linux específicamente.

    – isedev

    30 de septiembre de 2014 a las 12:46

  • Sí, actualicé mi comentario de inmediato, lo capturaste antes de que pudiera guardar mi edición. Estás en lo correcto. /proc/mount tiene una deficiencia en Linux. Si crea un entorno chroot y no mount -o bind dentro del chroot, /proc/mounts no listará ninguno de los montajes chroot. Sin embargo, el comando de montaje (dentro del chroot) lo hará. df tampoco, por eso mi preferido es ejecutar mount.

    -Michael Petch

    30 de septiembre de 2014 a las 13:01


  • mount -o bind es un lugar común en Linux chroot ya que no hay dispositivos de bloque físicos para montar (las rutas no se conectan directamente a un dispositivo de bloque). Sin embargo haciendo mount -o bind en un sistema Linux generalmente no se muestra en /proc/mounts (al menos no ningún kernel/distribución de Linux que yo sepa todavía). Sin embargo, mount también le mostrará los montajes realizados con -o bind.

    -Michael Petch

    30 de septiembre de 2014 a las 13:12


  • @MichaelPetch /proc/mounts lo hace enumerar los sistemas de archivos montados con mount -o bind. Sin embargo, lo hace de una manera confusa (el campo ‘dispositivo’ en el dispositivo físico, no el directorio enlazado, y las opciones de montaje/tipo del sistema de archivos no indican que sea un montaje enlazado). Bueno, al menos, en Fedora 20, kernel 3.16.2 lo hace.

    – isedev

    30 de septiembre de 2014 a las 13:16


La manera bash de hacerlo, solo por diversión:

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

  • open('/proc/mounts').read() es un comienzo para Python. (Respuesta impresionante por cierto)

    – temoto

    3 de julio de 2016 a las 23:39

avatar de usuario
Michael Petch

No conozco ninguna biblioteca que lo haga, pero simplemente podría iniciar mount y devolver todos los puntos de montaje en una lista con algo como:

import commands

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

El código recupera todo el texto del mount -v comando, divide la salida en una lista de líneas y luego analiza cada línea para el tercer campo que representa la ruta del punto de montaje.

Si quisieras usar df entonces también puede hacerlo, pero debe eliminar la primera línea que contiene los nombres de las columnas:

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)

Una vez que tenga los puntos de montaje (mntpoints lista) puede usar for in para procesar cada uno con un código como este:

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

Python tiene un módulo de procesamiento de correo llamado smtpliby uno puede encontrar información en el Documentos de Python

¿Ha sido útil esta solución?