Man*_*har 7 c linux dll shared-libraries
如果我的进程正在加载一个.so库,并且如果有一个新版本的库可以切换到新库而无需重新启动进程吗?或者答案取决于是否对库中的某个现有函数进行参数更改?
我在一个相当大的系统中工作,该系统运行100个进程,每个进程加载10个库.这些库提供特定功能,由不同的团队提供.因此,当其中一个库发生更改时(对于错误修复可以说),理想的做法是在不影响正在运行的进程的情况下将其发布到引擎盖下.可能吗 ?
编辑谢谢!在我的情况下,当一个新库可用时,所有正在运行的进程必须开始使用它.它不是让它们与旧版本一起运行并在以后提取新版本的选择.所以看起来更安全的选择就是重新加载进程.
在运行进程的情况下,无法动态升级链接库.您甚至可以尝试,但如果您已经成功(并且您不会因"正在使用的文本文件"错误消息而失败),则必须重新启动该过程以使其将新库映射到内存中.
您可以使用lsof命令检查链接的库(运行时或链接时):
lsof -p <process_pid> | grep ' mem '
Run Code Online (Sandbox Code Playgroud)
一种有趣的技术,虽然它在检查点恢复步骤中有些容易失败,但是要做一个不可见的重启.
您的服务器进程或其他任何内容将所有必要的信息保存到磁盘文件中.包括文件描述符号和当前状态.然后,服务器进程执行exec系统调用以执行自身,替换其自身的当前版本.然后它从磁盘文件中读取其状态并恢复为其文件描述符提供服务,就好像什么都没发生一样.
如果一切顺利,重启是不可见的,新进程正在使用所有更新的库.