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!
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)
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!
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.
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.