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
你为什么不这样做呢:
那就意味着一切 在里面 阿尔法被摧毁了,阿尔法 从不 删除,并移动所有内容。 |
CaTx · 使用带有一个大于号和两个大于号的回波的区别 2 年前 |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
Ty Q. · 分段故障GLFW3/GLAD 2 年前 |
ShortArrow · 如何使用git管理链接源文件? 2 年前 |
Bastien L. · 多Linux Grafana集成 2 年前 |