Linux上的Python:如何*立即*将文件移动到USB,以避免操作系统未同步和USB突然被拉出的问题

射频

我有一个使用shutil的Python脚本,可以自动将文件从内部文件夹移动到任何现有的USB驱动器。即使脚本关闭后,操作系统似乎也不会始终将文件移至USB驱动器。我的研究表明,操作系统这样做是为了达到均衡磨损的目的,但是我不确定这是真正的解释。我可以添加一些东西(理想情况下添加到我的Python脚本中或绑定到我的Python脚本中),以便实际上可以立即执行写入吗?也许以其他方式移动文件,以某种方式要求立即同步,验证文件是否确实已移动,或者执行一些后续操作,这些操作将要求操作系统真正执行移动?

需要明确的是,我并不是在讨论写操作正在进行时拔出USB带来的问题。这些文件的大小总计不多,即使将驱动器拉紧40秒钟以上,我也能看到问题。驱动器没有闪烁。我没有看到部分文件移动的部分写入,而其他部分没有写入,这表明我正在中途中断它。即使这是问题,我认为我的问题仍然是一个有效的问题。

背景:我在Pi4上运行Raspbian Buster桌面版本和Python 3.7.3。我想在没有键盘或显示器的情况下运行该Pi,因此不需要用户干预即可拉出驱动器或放入替换驱动器。尽管没有显示器,我仍必须运行桌面,否则Pi不会自动安装USB驱动器,但这是一个单独的问题。我是菜鸟,因此特别感谢您提供详尽的解释。

马克·里德

正如@tdelaney在他们的评论中所说,彻底杀伤点的方法是先调用flush()文件对象,然后调用os.fsync()其文件描述符,这是因为Raspbian基于Linux内核,直到缓冲区被刷新。

但是,如果您使用的是shutil.copy*函数之一,则没有文件对象可以调用这些函数,因此只需调用即可os.system("sync")

但是请注意,即使内核正在动手说“是的,刷新了这些缓冲区”,数据仍可以通过设备驱动程序内部进行工作,而尚未实际写入媒体。除非您手动驱动USB逻辑,否则您将无法100%保证它一直都通过,但是第二个最好的事情就是添加命令来卸载文件系统。

问题在于,从USB记忆棒运行的代码无法卸载包含自身的文件系统,因此,如果您的Python位于记忆棒上,则无法进行卸载。不过,您可以从命令行手动进行操作。只是umount /path/to/usb/stick应该这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档