java—在进程运行时将符号链接更新到jar安全吗?

kx5bkwkv  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(365)

因此,我正在考虑为我的进程设置部署脚本,以指向指向我的应用程序的最新版本jar的符号链接。
所以:
symlink x->/path/to/jar/version\u 1.0.0
现在,我的进程的脚本将加载jar,并在它的开始脚本中引用symlinkx。
现在我的问题是:
如果进程仍在运行…我是否可以安全地将symlink x更新为:
symlink x->/path/to/jar/version\u 1.2.0
我不会删除/path/to/jar/version\u1.0.0,因此它仍将保留在主机上。
我担心的是,进程可能会开始从新的symlink路径而不是脚本最初运行时使用的/path/to/jar/version\u 1.0.0路径加载尚未在内存中的jar。

dzhpxtsq

dzhpxtsq1#

总的来说,我认为你的担心是对的。jvm动态加载类,当它们确实需要的时候。
因此,当流程运行时,可能还没有加载某些类(比如说,您“导入”了一些自当前运行开始以来尚未触发的特定业务流的类)。因此,如果你改变链接,它可能会有一些东西会打破。
因此,如果您确实需要提供“无需重新启动”的升级,您最好采用不同的方式:
同时启动两个jvm:一个运行旧进程,另一个运行新进程
当新版本“就绪”时启动开始将流量路由到它(好的,这实际上取决于应用程序的实际功能)
当你看到它按预期工作-停止旧的应用程序。
现在这实际上取决于应用程序的实际外观,您可能需要同步dbs的状态,同时使用两个版本的应用程序执行请求,等等,所以在一般情况下,这可能是非常复杂的事情。
一些现代的高级工具(比如kubernetes)可以在devops领域有所帮助,但是您仍然需要了解应用程序中到底发生了什么才能达到最佳效果。

nr7wwzry

nr7wwzry2#

这完全取决于何时更新符号链接以及何时加载jar。创建符号链接时,会分配一个新的inode,这意味着您的符号链接与原始文件是不同的实体。
当您更新(再次取消链接+链接)符号链接时,它基本上会创建一个新的inode。因此,如果您的第一个符号链接已经被调用和使用,那么新的符号链接将不再使用,除非再次调用。虽然它们有相同的路径,但在文件系统级别上是不同的资源。

相关问题