Eu daria uma olhada em os.path.ismount()
.
Eu tenho um script de backup escrito em Python, que cria o diretório de destino antes de copiar o diretório de origem para ele. Eu configurei-o para usar /external-backup
como o destino, que é onde eu montei um disco rígido externo. Acabei de rodar o script sem que o disco rígido estivesse ligado (ou sendo montado) e descobri que ele estava funcionando normalmente, apesar de fazer um backup no disco rígido interno, que não tem nem espaço suficiente para backup.
A minha pergunta é: como posso verificar se o volume está montado no lugar certo antes de escrever nele? Se eu conseguir detectar que /external-backup
não está montado, posso evitar a gravação.
A questão do bônus é por que isso foi permitido, quando o sistema operacional sabe que o diretório deveria estar em outro dispositivo e o que aconteceria com os dados (no disco rígido interno) se eu montasse esse dispositivo posteriormente? dirigir)? Claramente não pode haver duas cópias em dispositivos diferentes no mesmo caminho!
Obrigado antecipadamente!
Eu daria uma olhada em os.path.ismount()
.
Para uma resposta definitiva a algo que apenas o kernel sabe ao certo, pergunte ao kernel:
cat /proc/mounts
Esse arquivo pode ser lido / analisado como se fosse um arquivo normal, usando qualquer ferramenta que você goste. Incluindo o Python. Exemplo rápido e sujo:
#!/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)
A maneira mais fácil de verificar é invocar mount
via subprocess
e ver se aparece lá em cima. Para crédito extra, use os.readlink()
no conteúdo de /dev/disk/by-*
para descobrir qual dispositivo é.
Resposta de bônus. Se o dispositivo externo não estiver montado, os dados serão gravados na partição raiz no caminho /external-backup
. Se o dispositivo externo estiver montado, os dados na partição raiz ainda estarão lá, mas não poderão ser acessados, pois /external-backup
agora está apontando para o dispositivo externo.
Pergunta antiga, mas pensei em contribuir com minha solução (com base em Dennis Williamson's e resposta de Ignacio Vazquez-Abrams ) de qualquer maneira . Como estou usando em um ambiente não-Linux para verificar diretórios remotos montados, / proc e mtab não podem ser usados e nenhuma verificação adicional foi implementada:
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
Melhorias bem-vindas!
O arquivo / etc / mtab existe para dizer o que está montado atualmente. Há uma chamada getmntent
, mas não acredito que ela tenha sido exportada no módulo os
. O rápido e sujo? Abra / etc / mtab e divida. Certifique-se de que seu dispositivo esteja presente na coluna 0 e o ponto de montagem de destino na coluna 1 esteja correto.