web-dev-qa-db-fra.com

Comment puis-je vérifier si un volume est monté où il est censé utiliser Python?

J'ai un script de sauvegarde écrit dans Python qui crée le répertoire de destination avant de copier le répertoire source. Je l'ai configuré pour utiliser /external-backup En tant que destination, laquelle est où je monte un disque dur externe. Je viens de courir le script sans que le disque dur soit allumé (ou être monté) et j'ai constaté qu'il fonctionnait normalement, mais faisant une sauvegarde sur le disque dur interne, qui n'a nulle part près de l'espace pour se remettre.

Ma question est la suivante: comment puis-je vérifier si le volume est monté au bon endroit avant d'y écrire? Si je peux détecter que /external-backup N'est pas monté, je peux m'empêcher d'écrire.

La question de bonus est pourquoi cela a-t-il été autorisé lorsque le système d'exploitation sait que le répertoire est censé vivre sur un autre appareil et que deviendra-t-il que les données (sur le disque dur interne) devraient-elles monter ultérieurement ce périphérique (le disque dur externe)? Clairement, il ne peut y avoir deux copies sur différents appareils sur le même chemin!

Merci d'avance!

9
Ben Hymers

Je reviendrais un coup d'oeil à os.path.ismount() .

Pour une réponse définitive à quelque chose que seul le noyau sait sûrement, demandez au noyau:

cat /proc/mounts

Ce fichier peut être lu/analysé comme s'il s'agissait d'un fichier normal, en utilisant des outils que vous aimez. Y compris python. Exemple rapide N-sale:

#!/usr/bin/python

d = {}

for l in file('/proc/mounts'):
    if l[0] == '/':
        l = l.split()
        d[l[0]] = l[1]

import pprint

pprint.pprint(d)
5
Insyte

Le moyen le plus simple de vérifier est d'invoquer mount via subprocess et voyez s'il apparaît là-bas. Pour un crédit supplémentaire, utilisez os.readlink() sur le contenu de /dev/disk/by-* Pour déterminer quel appareil il est.

Vieille question, mais je pensais que je contribuerais à contribuer ma solution (basée sur Dennis Williamson's et Ignacio Vazquez-Abrams's Réponse de toute façon). Depuis que je l'utilise sur un environnement non linux pour vérifier que les répertoires distants sont montés, /ProC et MTAB ne peut pas être utilisé et aucun contrôle supplémentaire n'a été implémenté:

def is_mounted(special, directory):
    search_prefix = '{} on {}'.format(special, directory.rstrip('/'))

    if os.path.ismount(directory):
        mounts = subprocess.check_output(['mount']).split('\n')

        for line in mounts:
            if line[:len(search_prefix)] == search_prefix:
                return True;

    return False

Améliorations Bienvenues!

2
Magentron

Réponse bonus. Si le périphérique externe n'est pas monté, des données sont écrites sur la partition racine sur le chemin /external-backup. Si le périphérique externe est monté, des données sur la partition racine sont toujours là, mais il n'est pas accessible car /external-backup est maintenant pointé vers un périphérique externe.

2
Casual Coder

Le fichier/etc/mtab existe pour vous dire ce qui est actuellement monté. Il y a un appel getmntent appel, mais je ne pense pas que cela soit exporté dans le module os. Le rapide et sale? Ouvrir/etc/mtab et divisé. Assurez-vous que votre appareil est présent dans la colonne 0 et le point de montage de destination dans la colonne 1 est correct.

1
McJeff