当我们构建Web软件版本时,我们在一个临时目录中准备该版本,然后将该版本目录替换为刚准备好的临时版本:
# Move and replace existing release directory.
mv /path/to/httpdocs /path/to/httpdocs.before
mv /path/to/$newReleaseName /path/to/httpdocs
在这种方案中,每15个版本中大约有1个,用户在运行上面的命令时正好使用原始版本目录中的文件,并且该用户发生致命错误。
我想知道在处理时间方面使用符号如下的符号会更快,从而有助于减少出现此问题的可能性:
# Remove and replace existing release symlink.
ln -sf /path/to/$newReleaseName path/to/httpdocs
答案 0 :(得分:6)
使用符号链接的主要优点是你可以原子地完成它。强制新的符号链接不是原子的,但您可以创建新的符号链接,然后将其重命名为现有符号链接。重命名是一个原子操作,所以你应该没有竞争条件。
ln -s /path/to/newrelease /path/to/httpdocs.tmp && mv -Tf /path/to/httpdocs.tmp /path/to/httpdocs
答案 1 :(得分:1)
在我看来,因为Linux中的mv
只是对inode信息的更改,并且ln
正在复制inode记录,所以它们都应该具有足够快的持续时间而你无法告诉与秒表的区别。
但我想知道他们是否真的会解决你的问题。我猜你说的是用户正在使用目标文件 - 所以它不会以任何方式失败吗?
答案 2 :(得分:1)
如果你跨越分区,它肯定会更快。在同一个分区中,我猜想使用链接仍然会更顺畅。
我的建议是计时 - 就像这样:
#!/bin/bash
for i in $(seq 1 1000); do
time mv /path/to/httpdocs /path/to/httpdocs.before
time mv /path/to/$newReleaseName /path/to/httpdocs
done
for i in $(seq 1 1000); do
time ln -sf /path/to/$newReleaseName path/to/httpdocs
done
最好收集真实的指标而不是猜测。
答案 3 :(得分:0)
请注意,符号链接可能会慢一些:http://httpd.apache.org/docs/2.0/misc/perf-tuning.html
它可以解决一个问题并创建另一个问题。