【发布时间】:2016-12-20 11:38:22
【问题描述】:
这不是一个真正的编程问题。我们有一个用 C++ 编写的大型系统,并在 Redhat Enterprise Linux 上使用许多共享对象 (.so) 和本机可执行文件。系统在多台主机上运行,我们使用 rsync 来保存部署的二进制文件(共享对象和可执行文件)
如果我们必须修复 .so(或可执行文件)中的错误,我们会将其部署到单个位置,然后跨所有其他主机进行 rsync
在使用(或运行)时覆盖 .so(或可执行文件)是否安全?我读到rm 和cp 是安全的,因为*nix 处理inode(某种引用计数)。但是说到rsync,却找不到满意的答案
【问题讨论】:
-
如果进程已经将
.so加载到内存中,这是非常安全的。 -
@OregonTrail,不管它是否已经加载——即使它只是打开但还没有读取,你仍然可以保持你的句柄在原始 inode 上,防止其释放。
-
顺便说一句,对于未来的非真正编程问题,请考虑unix.stackexchange.com(与操作系统相关时)或superuser.com
-
...了解什么是inode 实际上是 并没有什么坏处——基本上,它是文件系统中实际存储文件内容的部分。要理解的重要一点是,inode 和目录条目是两个不同的东西——你可以让一个 inode 有多个目录条目(硬链接),或者根本没有目录条目。在最后一种情况下,将在没有人打开该文件后将其删除,但由于该规定(在实际删除之前等待所有预先存在的句柄关闭),可以在使用时安全地删除或替换文件。
-
...现在,更大的问题是,虽然 rsync 可以安全且原子地替换 just one 可执行文件,但它不能替换 multiple 可执行文件作为原子操作,因此您可以拥有一个只完成部分更新的地方,并且任何重新启动服务的尝试都会失败。