![]() |
1
56
最终的解决方案是结合符号链接和重命名方法:
当然,访问alpha的应用程序必须能够处理路径中更改的符号链接。 |
![]() |
2
21
如果使用符号链接,则可以执行此操作: 假设alpha是指向目录alpha_1的符号链接,您希望将符号链接切换到指向alpha_2。以下是切换前的情况:
要使alpha引用alpha_2,请使用ln-nsf:
现在,您可以删除旧目录:
请注意,这实际上并不是一个完全原子化的操作,但它确实发生得非常快,因为“ln”命令同时取消链接,然后立即重新创建符号链接。您可以使用strace验证此行为:
您可以根据需要重复此过程:例如,当您有新版本时,alpha_3:
|
![]() |
3
15
http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ |
![]() |
4
11
自Linux3.15以来,新的
(当然,您应该进行适当的错误处理等。请参阅
this gist
对于一个更复杂的
也就是说,其他人提到的符号链接解决方案既简单又可移植,因此除非
2020年更新:自2018-08-01发布glibc 2.28(Debian Stretch,Fedora 29)以来,该系统调用的glibc包装器可用。不过,它仍然无法通过coreutils访问。
|
![]() |
5
8
因此,如果创建和删除文件操作是原子操作: 1) 创建一个名为“信号量”的文件。 2) 如果且仅当该操作成功(与现有文件无冲突),则执行该操作(处理alpha或移动目录,具体取决于进程) 3) rm信号量。 |
![]() |
6
6
但在阿尔法不存在的地方,仍然会有一个小窗口。 为了最大限度地降低在alpha不存在时尝试使用alpha的可能性,您可以(如果您有权限):
|
![]() |
7
4
SQLite 文件科 File Locking and Concurrency in SQLite Version 3 对其升级锁定协议进行了详细描述,以控制并发读取、独占写入和崩溃后回滚。其中一些想法适用于这里。 |
![]() |
8
4
这应该可以做到:
这对我来说是非常原子的。 |
![]() |
9
1
即使您直接访问inode,也无法在用户空间中自动交换inode值。 |
![]() |
10
1
Oddthinking的信号量方法是唯一的出路。 如果您不能修改其他任务,那么在进行替换之前,您必须确保它没有运行。 |
![]() |
11
0
我不相信有任何原子方法可以做到这一点。您的最佳选择是执行以下操作:
|
![]() |
12
0
|
![]() |
13
0
mv和ln可用于原子操作。我使用ln(1)以原子方式部署web应用程序。
例如
|
![]() |
14
0
|
![]() |
15
0
它将alpha的内容隐藏起来,但是如果您想清除它,可以将父文件系统绑定到其他位置。 如果文件系统是NFS导出的,您可能需要确保导出选项允许跨越文件系统边界,并在服务器上进行绑定装载。 对于在alpha目录或子目录(例如cwd)上具有打开句柄的进程,您还需要小心。
|
![]() |
16
-2
你为什么不这样做呢:
那就意味着一切 在里面 阿尔法被摧毁了,阿尔法 从不 删除,并移动所有内容。 |
![]() |
Jerome · 用于检查成功响应的脚本,而不仅仅是200[已关闭] 3 月前 |
![]() |
NullVoxPopuli · 重命名文件夹的最快方法是什么?[关闭] 4 月前 |
![]() |
YorSubs · Linux中遍历目录的时间不同方法[关闭] 5 月前 |
![]() |
Plankt0n · Shell,执行一个需要逐一遍历多个值的命令 5 月前 |
![]() |
Andres Mora · 如何根据文件名条件删除文件夹中的图像? 5 月前 |