3

我有一个在 OSX 上运行的 bash 脚本。
它需要处理网络共享(Synology NAS 上的 AFP 共享)上的一些文件。

不幸的是,当脚本运行时,这些文件有时仍在被写入。

如何确定文件是否正在使用?

常规方法是使用“lsof”,但如果其他用户来自 LAN 上的另一个客户端,这似乎不适用于网络文件。

我可以尝试重命名文件。我想如果文件正在使用中会失败,但这远非优雅。

有人有更好的解决方案吗?

4

2 回答 2

3

这不是一个普遍可以解决的问题。典型的解决方案是将文件写入临时位置,然后将其移动到最终处理目录(因为在文件系统内移动通常是原子的)。如果您无法控制文件的写入方式或位置,那么您就只能采用启发式方法,特别是查看文件并查看它是否在“一段时间”内没有增长,但与分离相比,这些都不是特别好的排队的写作。

于 2013-05-11T22:35:49.957 回答
1

其他潜在的访问是由任意程序完成的,还是可以假设它是由在其他客户端上运行的程序的其他实例完成的?

如果该文件对您的程序是私有的,那么您的程序的所有实例都可以参与合作锁定方案。例如,您可以使用lockfile命令。即使面对信号/异常,也要确保清理您的锁定文件。您可以使用trap内置命令来帮助解决这个问题。请参阅此处以获取解释。

于 2013-05-12T06:02:47.107 回答