Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有一个在 OSX 上运行的 bash 脚本。 它需要处理网络共享(Synology NAS 上的 AFP 共享)上的一些文件。
不幸的是,当脚本运行时,这些文件有时仍在被写入。
如何确定文件是否正在使用?
常规方法是使用“lsof”,但如果其他用户来自 LAN 上的另一个客户端,这似乎不适用于网络文件。
我可以尝试重命名文件。我想如果文件正在使用中会失败,但这远非优雅。
有人有更好的解决方案吗?
这不是一个普遍可以解决的问题。典型的解决方案是将文件写入临时位置,然后将其移动到最终处理目录(因为在文件系统内移动通常是原子的)。如果您无法控制文件的写入方式或位置,那么您就只能采用启发式方法,特别是查看文件并查看它是否在“一段时间”内没有增长,但与分离相比,这些都不是特别好的排队的写作。
其他潜在的访问是由任意程序完成的,还是可以假设它是由在其他客户端上运行的程序的其他实例完成的?
如果该文件对您的程序是私有的,那么您的程序的所有实例都可以参与合作锁定方案。例如,您可以使用lockfile命令。即使面对信号/异常,也要确保清理您的锁定文件。您可以使用trap内置命令来帮助解决这个问题。请参阅此处以获取解释。
trap