2017-01-10 35 views
-1

我有我想要做以下的一个基本的脚本:NFS - 来自两个客户端文件损坏的mv命令?

  1. 如果新/ file.txt的存在
  2. MV新/ file.txt的电流/ file.txt的

现在 - 如果两台服务器在同一时间运行同一脚本(可访问相同的NFS文件共享):

  • 服务器1 - 步骤1.检查文件是否存在。真
  • 服务器2 - 步骤1.检查文件是否存在。真
  • 服务器1 - 步骤2.开始执行“mv”命令
  • 服务器2 - 步骤2。

从我可以在网上找到,它看起来像一个错误只会得到由服务器2抛出 - 但没有文件损坏或任何东西应该关注的问题: http://nfs.sourceforge.net/

文件句柄指已删除的文件。在 服务器上删除文件后,客户端在尝试访问文件 时才发现它们具有文件句柄,而该文件句柄是从先前的LOOKUP缓存的。使用rsync 或MV进行替换的文件,而它在使用另一个客户端上是 常见的情况导致的ESTALE错误。

我试图模拟该确认,但一直没能成功地这样做 - 所以我想实施这一战略之前,这里检查:

问: 我的理解是正确的 - 或我是否需要使用不同的策略来确保file.txt不会被破坏?

其他细节: 亚马逊Linux操作系统。该驱动器安装为nsf4。该文件可能是大到100MB

+0

如果您要倒票,请提供一个理由,以便我可以相应地调整问题。 – Phas1c

回答

2

的检查,如果文件-存在是一个典型的TOCTTOU问题。

最简单的解决方法是只检查,并尝试mv。 如果没有要移动的文件,则mv将失败(并且不执行任何操作)。

+0

好的,有道理。服务器1开始执行“mv”并且服务器2在服务器1完成之前试图“mv”(即,我猜这个文件仍然在源目录中可见)是否有可能?或者这是通过文件系统级别的一些互斥/锁控制的? – Phas1c