多个目录的原子复制

has*_*sen 3 linux deployment

这个问题是关于 Web 应用程序的部署。

介绍(可以跳过)

我正在使用 django,我的托管服务提供商设置他们的 django 支持的方式最终导致 webapp 分散在至少三个位置:

  • 实际应用代码 /something/<my_apps>/
  • 网站设置/网址/模板在 /something/<my_site>/
  • css、javascript 和其他“媒体” /something_else/media/

所以当我部署/升级网站时,我需要一次更新几个目录。

实际问题:

有没有办法进行原子文件复制?我无论如何都不是 linux 系统的“专家”,所以请原谅我的无知。

复制操作涉及几个目录树,两个或三个,基本上:

copy _tree1 to tree1
copy _tree2 to tree2
Run Code Online (Sandbox Code Playgroud)

通过原子,我的意思是:

  • 它要么完全复制,要么根本不复制。它永远不应该处于某些复制但某些失败的状态。
  • 它是在尽可能短的时间内完成的。理想情况下,系统不应该看到正在进行的副本,它要么看到文件的旧版本,要么看到新版本;它在任何时候都不会看到文件 A 的旧版本,而是文件 B 的新版本。如果这不是完全可能的,那么它应该不会超过几毫秒。

我的想法是使用双缓冲之类的东西:例如,我在暂存区准备所有内容_tree_x,然后将其复制移动到tree_xwith 应该是一个原子操作,该操作只是更改磁盘上的指针。

我认为单个这样的复制移动操作在 linux 中是原子的(不是吗?),但我也需要几个这样的操作也是原子的;我希望它们被视为单一移动操作。

Cli*_*ore 6

我认为你在正确的轨道上有一个集结区。我不知道任何原子命令,但是如果您暂存文件,然后使用脚本删除第一个目录并移动(而不是复制)第二个目录,并对所有三个目录执行此操作,它应该非常快。

或者,您可能想要使用符号链接。这样你可以大致:

/version/22/<my-apps>
/version/22/<my-site>
/version/22/<my-media>
Run Code Online (Sandbox Code Playgroud)

并部署/version/23具有相同子目录的目录。然后,实际文件的位置(再次,为了速度,您需要一个脚本),您可以使用符号链接,以便当任何人转到最新页面时,他们都会获得当前的任何版本(这一切都会发生透明地,他们不知道)。这样做的好处是您的旧作品仍然存在,直到您决定将其删除。[虽然,当然,版本控制系统更适合用于保留较旧的工作。]

您必须检查 1) 您可以运行脚本(并且以 Web 用户无法运行的方式!),以及 2)您可以使用符号链接(因为某些 Web 服务器被配置为不遵循它们。)