Назад | Перейти на главную страницу

Как я могу проверить, смонтирован ли том там, где предполагается использовать Python?

У меня есть сценарий резервного копирования, написанный на Python, который создает целевой каталог перед копированием в него исходного каталога. Я настроил его для использования /external-backup в качестве места назначения, куда я монтирую внешний жесткий диск. Я просто запустил сценарий без включения (или подключения) жесткого диска и обнаружил, что он работает нормально, хотя и делал резервную копию на внутреннем жестком диске, на котором нет места для резервного копирования.

У меня вопрос: как я могу проверить, смонтирован ли том в нужном месте, прежде чем писать на него? Если я смогу обнаружить это /external-backup не смонтирован, я могу предотвратить запись в него.

Бонусный вопрос: почему это было разрешено, когда ОС знает, что этот каталог должен находиться на другом устройстве, и что произойдет с данными (на внутреннем жестком диске), если я позже смонтирую это устройство (внешний жесткий диск)? Ясно, что не может быть двух копий на разных устройствах по одному и тому же пути!

Заранее спасибо!

Я бы посмотрел на os.path.ismount().

Чтобы получить окончательный ответ на вопрос, который точно знает только ядро, спросите ядро:

cat /proc/mounts

Этот файл можно прочитать / проанализировать, как если бы это был обычный файл, с помощью любых инструментов, которые вам нравятся. Включая Python. Быстрый и грязный пример:

#!/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)

Самый простой способ проверить - вызвать mount через subprocess и посмотрите, появится ли он там. Для дополнительного кредита используйте os.readlink() по содержанию /dev/disk/by-* чтобы выяснить, что это за устройство.

Бонусный ответ. Если внешнее устройство не подключено, данные записываются в корневой раздел по пути /external-backup. Если внешнее устройство подключено, данные в корневом разделе все еще существуют, но недоступны, потому что /external-backup теперь указывает на внешнее устройство.

Старый вопрос, но я подумал, что внесу свое решение (на основе Деннис Уильямсон и Игнасио Васкес-Абрамсответ) в любом случае. Поскольку я использую его в среде, отличной от Linux, для проверки монтируемых удаленных каталогов, / proc и mtab не могут быть использованы и дополнительных проверок не проводилось:

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

Улучшения приветствуются!

Файл / etc / mtab существует, чтобы сообщить вам, что в настоящее время смонтировано. Eсть getmntent звоните, но я не думаю, что он экспортируется в os модуль. Быстрый и грязный? Откройте / etc / mtab и разделите. Убедитесь, что ваше устройство присутствует в столбце 0, а точка монтирования назначения в столбце 1 правильная.