我有一个bash脚本在OSX上运行。
它需要操作网络共享(Synology NAS上的AFP共享)上的一些文件。
不幸的是,当脚本运行时,这些文件有时仍在被写入。
如何确定文件是否在使用中?
正常的方法是使用"lsof",但如果其他用户来自LAN上的另一个客户端,那么这似乎对网络文件不起作用。
我可以尝试重命名文件。我想,如果文件正在使用,这将失败,但这远远不够优雅。
谁有更好的解决方案?
这通常不是一个可以解决的问题。典型的解决方案是将文件写入临时位置,然后将其移动到最终处理目录(因为在文件系统内移动通常是原子的)。如果您无法控制文件写入的方式或位置,那么您就只能使用启发式方法,特别是查看文件并查看它是否在"一段时间"内没有增长,但是与将写入与排队分开相比,这些方法都不是特别好。
其他潜在的访问是由任意程序完成的,还是可以假设它是由运行在其他客户机上的程序的其他实例完成的?
如果文件是程序的私有文件,那么程序的所有实例都可以参与协作锁定方案。例如,您可以使用lockfile命令。即使面对信号/异常,也要确保清理锁文件。您可以使用trap
内置命令来帮助完成此操作。