У меня есть сценарий резервного копирования, написанный на 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 правильная.