简介(你可以跳过)
我正在使用django,我的托管服务提供商设置他们的django支持的方式最终导致webapp分散在至少三个位置:
> / something /< my_apps> /中的实际应用程序代码
> / something /< my_site> /中的网站设置/网址/模板
> / something_else / media /中的css,javascript和其他“媒体”
所以当我部署/升级网站时,我需要一次更新几个目录.
实际问题:
有没有办法让原子文件复制?我无论如何都不是linux系统的“专家”,所以请原谅我的无知.
复制操作涉及几个目录树,基本上是两个或三个:
copy _tree1 to tree1 copy _tree2 to tree2
原子,我的意思是:
>它要么完全复制,要么根本不复制.它永远不应该处于某种复制状态但有些失败状态.
>这是在尽可能短的时间内完成的.理想情况下,系统在正在进行的过程中看到副本时,应该没有任何时间点,它要么看到旧版本的文件,要么看到新版本;在任何时候它都不会看到文件A的旧版本,而是文件B的新版本.如果这不完全可能,那么它应该不会超过几毫秒.
我的想法是有一些像双缓冲的东西:我在暂存区域准备一切,例如_tree_x,然后将它复制移动到tree_x,应该是一个简单地改变磁盘上指针的原子操作.
我认为单个这样的复制移动操作在linux中是原子的(不是吗?),但是我需要几个这样的操作才是原子的;我希望他们被视为一次移动操作.
解决方法
或者,您可能想要使用符号链接.那样你可以大致:
/version/22/<my-apps> /version/22/<my-site> /version/22/<my-media>
并使用相同的子目录部署/ version / 23目录.然后,实际文件会去(并且再次,为了速度,你需要一个脚本),你可以使用符号链接,这样当任何人进入最新页面时,他们会获得当前的任何版本(这一切都发生了)透明,他们不知道).这样做的好处是,在您决定删除之前,您的旧工作仍然存在. [虽然,授予,版本控制系统更适合用于保持较旧的工作.]
您必须检查1)您可以运行脚本(以及Web用户不能这样做的方式!),以及2)您可以使用符号链接(因为某些Web服务器配置为不遵循它们.)