【发布时间】:2010-09-23 08:58:57
【问题描述】:
我在同一个父目录中有两个目录。调用父目录 base 和子目录 alpha 和 bravo。我想用 bravo 替换 alpha。最简单的方法是:
rm -rf alpha
mv bravo alpha
mv 命令是原子的,但 rm -rf 不是。 bash 中是否有一种简单的方法可以用 bravo 原子地替换 alpha?如果没有,有没有复杂的方法?
附录:
顺便说一句,如果目录在短时间内不存在,这不是一个无法解决的问题。只有一个地方会尝试访问 alpha,它会在执行任何关键操作之前检查 alpha 是否存在。如果不是,它会给出错误消息。但如果有办法做到这一点,那就太好了。 :) 也许有一些方法可以直接修改 inode,或者其他什么...
【问题讨论】:
-
您在附录中的测试不安全 - 存在竞争条件。考虑一下如果检查首先运行(并且 Alpha 存在)然后在第二个进程删除 Alpha 时将其切换出来,然后再切换回以继续运行,此时 Alpha 丢失了,会发生什么情况。