`rm -rf` 不是原子的吗?

zer*_*kms 11 rm

我刚刚发现了一个令人困惑的错误:

rm: cannot remove `xxx/app/cache/prod': Directory not empty
Run Code Online (Sandbox Code Playgroud)

这是由以下命令引起的:

rm -rf $cache_dir/*
Run Code Online (Sandbox Code Playgroud)

其中$cache_dir定义为xxx/app/cache

所以我认为它是这样的:rm删除cache/proddir 中的所有内容,然后就在它尝试删除cache/prod目录之前 - 另一个程序在其中创建了一个文件/目录,因此导致rm失败。

我的假设正确吗?

slm*_*slm 7

给出的错误消息是“目录不为空”(ENOTEMPTY),鉴于您的假设听起来是正确的,这是一种竞争条件,即程序在rm尝试删除该目录之前在该目录中创建了一个文件,从而ENOTEMPTY从基础rmdir(2).

注意:为了安全起见,您可以将目录移动/重命名为新名称,然后执行删除该目录的操作。

  • 这个答案是错误的,即使文件正在使用中,您也可以删除目录条目,然后删除该目录。`mkdir x 的简单测试;猫 > x/a &; 尾-fx/a &; rm -rx` 显示即使文件正在使用中,也可以删除目录,无论它们是打开还是读取。 (2认同)