我有一个符号链接,指向通过网络文件系统安装的目录,如下所示:
2023 -> /mnt/bulk013/obs_data_archive/metwatch/2023/
现在我想用它指向的文件夹替换符号链接,这种方式不会干扰经常从此目录(原子地)读取的高效应用程序。在我的例子中,这意味着首先将所有数据复制到我的本地硬盘驱动器(文件夹
2023
所在的位置)。我这样做并使用临时目录来存储文件:
2023.tmp/
所以现在的问题是,如何自动切换符号链接与实际文件夹,以便该文件夹的名称为
2023
?
2023 -> /mnt/bulk013/obs_data_archive/metwatch/2023/ # remove this
2023.tmp/ # and replaced with this (renamed to 2023)
简单来说,如果我们有:
link -> dir/
并想将其混合成:
link/
看起来我们想要的是执行系统调用rename("dir", "link/")
。不幸的是,这在
errno
为 20 (
ENOTDIR
) 的 Linux 上不起作用。这是 POSIX 对
rename
的记录:
rename
可以返回
ENOTDIR
的原因之一是:
看起来可能没有办法做到这一点;它必须分两次操作完成,需要暂停访问应用程序。旧参数命名一个目录,新参数命名一个非目录文件
如果应用程序由少量进程组成,您可以将所有进程都
kill -STOP
,进行混合,然后
kill -CONT
。对于停止的进程,该操作将显示为原子操作。