Казалось бы.
Скрипт - https://privatebin.net/?7a925a1ae401d088#6XCisGp9xAX7viZZKuKzvGFJRbUWFgNsGKeo2oc4VHHP
Задача скрипта - бэкапнуть содержимое докер контейнеров. Сначала бэкапает на второй диск в NAS, потом бэкапает на внешний диск, потом бэкапает на удаленный сервер. Бэкапы на внешний диск и удаленный сервер делается не с основного, а со второго внутреннего, чтобы быстрее можно было заново запустить контейнеры (да, я тушу контейнеры на время бэкапа, а не использую дампы и прочие тулзы live бэкапов, потому что это домашний сервер и 2 минуты запланированного даунтайма для меня приемлемо).
Проблема в бэкапе на внешний диск, который маунтится в /mnt/mirror
. Скрипт выполняется от рута. Как видно, в методе mount класса ExternalDrive
есть -v
. Так я хотел отдебажить проблему, которая заключается в том, что когда скрипт запускается из крона, по какой-то причине внешний диск после расшифровки не маунтится. Бэкап заливается просто в корень, где нет свободного места под такой объем информации. Скрипт умирает. При этом если запускать вручную, то монтирование всегда успешно.
Проблемное место, видимо, тут
def mount(self):
"""Mount drive."""
dev_path = Path(f'/dev/mapper/{self.decrypt_name}')
subprocess.run([
'mount',
'-v',
dev_path,
self.mount_point
])
self.mount_point
тут /mnt/mirror
. Он существует, никаких ограничений на нем нет.
Как видно из логики в main
, у меня есть дополнительная проверка на успешность монтирования:
drive.mount()
if drive.mount_point.is_mount():
backup_to_external_drive()
multisync()
drive.umount()
Если к точке монтирования не промонтировал внешний диск, дальнейший бэкап не должен идти. Судя по документации:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False) Run the command described by args. Wait for command to complete, then return a CompletedProcess instance.
при использовании subprocess.run
ожидается полное выполнение команды. Значит нет проблемы в том, что скрипт идет дальше после запуска одного из subprocess не ожидая его завершения.
При запуске вручную лог выглядит так:
2023-04-13 13:20:03 INFO Script backup_docker started
2023-04-13 13:21:09 INFO Finished in 00h 01m 06s
При запуске из крона так:
2023-04-14 02:00:01 INFO Script backup_docker started
Дальше пусто, т.к. все зависло (системный диск переполнен). В итоге получается так, что доходя до места, где задействуется функция бэкапа на внешний диск, он вроде как смонтирован, дополнительную проверку на наличие точки монтирования прошел, а на самом деле диск не смонтирован.
Почему при ручном выполнении скрипта внешний диск монтируется, а при выполнении из крона нет (или слишком быстро отмонтируется)?