让多个并行作业使用创建同一个目录是否危险mkdir -p
?(这是在Linux下。)
在我的例子中,我将许多作业发送到 SUN 网格以并行处理它们,其中一些作业从创建某个目录开始foo
。因此,不同命令的执行mkdir
可能恰好同时发生……
答案1
一个简单的 mkdir 是原子的(如果您使用的是 NTFS,则可能不是原子的,需要进行一些检查)。
通过推论,mkdir -p folder1/folder2/ 首先创建 folder1,这是原子性的。如果同时另一个进程也尝试创建 folder1,它将看到 folder1 已创建,因此它将尝试创建 folder2,这将失败(如果第一个进程已经创建了 folder2)或成功,并且第一个进程将失败。
如果正确处理(即良好的错误处理),这应该不是问题。
答案2
多个并发(竞争)命令不会对任何 POSIX 兼容文件系统造成危险mkdir -p
。事实上,我已经通过使用数百个竞争进程测试了自己的 shell 脚本锁定功能(环绕mkdir ... || ...
(但不使用-p
),以检测 Linux 和 Solaris 上几个不同的本地操作系统上的竞争导致的任何故障。我从未看到任何故障,我的搜索和阅读表明它应该是安全的。
(挑剔:在你的情况下,听起来原子性不是必需的。原子性对于互斥/锁定至关重要,但对于单纯的安全性而言并非必要 ---mkdir()
当目录已经存在时可能会安全失败。多个赛车mkdir
shell 命令应该各自有一些调用在它们遍历目标路径的组件并尝试创建每个组件时无害地失败。原子性与此无关)。
答案3
本地文件系统应该是 posix,并且所有操作(包括目录的创建)都应该是原子的。
我猜这归结于 mkdir -p 在开始创建路径然后突然遇到该路径中已经创建的(进一步)元素时所做的操作。如果它是正常的,它将独立于之前所做的操作继续,您的操作应该是安全的。有关特定 mkdir 工具的详细信息,您应该查看源代码。
在网络/集群文件系统上,它很可能取决于网络延迟、服务器负载或挂载选项。
此外,编写一个以高并发性多次尝试的脚本并不难,失败应该很容易检测到。
答案4
不,这并不危险。
一项作业将成功创建目录,其他作业将失败。