Python на Linux: как * немедленно * переместить файлы на USB, чтобы избежать проблем из-за того, что ОС не синхронизируется и USB внезапно извлекается - PullRequest
0 голосов
/ 01 августа 2020

У меня есть сценарий Python, использующий shutil для автоматического перемещения файлов из внутренней папки на любые имеющиеся USB-накопители. Даже после закрытия скрипта кажется, что ОС не всегда действительно перемещает файлы на USB-накопитель до некоторого времени. Мои исследования показывают, что ОС выполняет эту задержку для выравнивания износа, но я не уверен, что это настоящее объяснение. Могу ли я что-то добавить (в идеале к моему Python скрипту или привязать к нему), чтобы запись действительно выполнялась немедленно? Может быть, другой способ переместить файл, какой-то способ потребовать немедленной синхронизации c, проверить, действительно ли файлы были перемещены, или выполнить какое-либо последующее действие, которое потребует от ОС действительно выполнить перемещение?

Для ясности, я не говорю о проблемах, связанных с извлечением USB-накопителя во время активной записи. В целом файлы имеют небольшой размер, и я вижу проблему, даже когда диск извлекается через 40+ секунд. Диски не мигают. Я не вижу частичных записей, когда одни файлы перемещены, а другие нет, что говорит о том, что я прерываю их на полпути. Даже если это была проблема, я думаю, что мой вопрос все еще актуален.

История вопроса: я использую настольную версию Raspbian Buster и Python 3.7.3 на Pi4. Я хочу запустить этот Pi без клавиатуры или монитора, чтобы не требовалось вмешательства пользователя, чтобы вытащить диски или заменить их. Мне нужно запустить рабочий стол, несмотря на отсутствие монитора, иначе Pi не будет автоматически подключать USB-накопители, но это отдельная проблема. Я новичок, поэтому особенно подробные объяснения будут особенно благодарны

1 Ответ

1 голос
/ 02 августа 2020

Как сказал @tdelaney в своем комментарии, наиболее точным способом является вызов flush() для файлового объекта, а затем os.fsync() для его файлового дескриптора, который, поскольку Raspbian основан на ядро Linux не должно возвращаться до тех пор, пока буферы не будут очищены.

Но если вы используете одну из функций shutil.copy*, у вас нет файлового объекта для их вызова, поэтому вы можете просто позвонить по номеру os.system("sync").

Но обратите внимание, что даже если ядро ​​вытирает пыль и говорит: «Ага, очистило эти буферы», данные все равно могут проходить через внутренние компоненты драйвера устройства и еще физически не написано в СМИ. Вы не можете получить 100% -ную гарантию, что все будет выполнено, если вы не запустите USB logi c вручную, но следующая лучшая вещь - это добавить команду для размонтирования файловой системы.

Проблема в том, что код, запущенный с USB-накопителя, не может размонтировать файловую систему, содержащую себя, поэтому, если ваш Python находится на флешке, он не может размонтировать. Однако вы можете сделать это вручную из командной строки. Просто umount /path/to/usb/stick должно это сделать.

...