首页 > 其他分享 >基于arthas热更新class脚本

基于arthas热更新class脚本

时间:2023-02-07 15:44:34浏览次数:43  
标签:脚本 tmp 插件 替换 arthas class

1. 概述

本地更新脚本是基于arthas工具的retransform命令热替换class,此方法用于在不重启项目的前提下,替换更新的class,如关键类添加打印日志,排查线上问题

但是arthas工具的命令稍显复杂,有那个时间还不如重新部署,因此需要一个可以快速替换的工具来进行替换

2. 方法一:ArthasHotSwap插件

使用idea插件 ArthasHotSwap插件,安装后,选中类名数据右键点击“swap this class”,会复制一个脚本,然后粘贴到项目启动的服务器上,可完成替换,具体网上均有教程,此处不多赘述。

3. 方法二:自定义shell脚本

我本人也使用过这个插件,但是试过几次均没有成功因此模仿ArthasHotSwap插件的流程,写了一个自定义脚本。

3.1. ArthasHotSwap 插件流程

大致流程如下:

1.将本地需替换的class文件,编码成base64文本文件,并上传至文件服务器(可能是OSS)
2.提供一个默认执行脚本,给用户复制
3.用户拿到复制脚本后,在服务器上执行
4.脚本下载base64文本文件,并解析成class文件
5.启动arthas命令,如果用户没有安装,脚本会自动安装,默认路径 /home/用户名xxx/.arthas/
6.执行arthas中的retransform 命令,将解析出来的class文件替换至运行的jvm中 

3.2. 自定义脚本

按照这个流程,我自定义写了一个脚本,去掉了上传文件服务器步骤,只需要把许替换的文件上传至服务器指定目录,启动脚本时指定项目包名称,即可完成指定项目多个class文件热替换

#热刷新class指定路径配置
updateClassPath="/tmp/replace"
#服务器上arthas路径
arthasPath="/home/cmp/.arthas/lib/3.6.7/arthas"
#入参 项目包名称,支持模糊匹配
projectName=$1

rm -f tmp_in
mknod tmp_in p
exec 8<> tmp_in
sh ${arthasPath}/as.sh --select $projectName <&8 &
echo "********************************************* Arthas HotSwap The Java Class *************************************************************"
sleep 1s
echo "
" >> tmp_in
sleep 3s
echo "开热加载......"
#遍历目录中的所有class文件
for file in ${updateClassPath}/*
do
    echo ${file}
    #如果file后缀是class 执行替换
    if [ "${file##*.}" = "class" ]; then
        #开始启动arthas项目
        echo "热加载${file}"
        echo "retransform ${file}" >> tmp_in
    fi
done
echo "quit" >> tmp_in

标签:脚本,tmp,插件,替换,arthas,class
From: https://www.cnblogs.com/yq12138/p/17098675.html

相关文章

  • 一款备受欢迎的用户脚本管理器插件TampermonKey-油猴脚本管理器安装与使用
    Tampermonkey简介Tampermonkey是一款备受欢迎的浏览器扩展和用户脚本管理器,它适用于目前各种主流浏览器。方便的脚本管理(正在运行的脚本和可以运行的脚本在图标处显示一......
  • ClassNames库详解
    简述ClassNames是一个用于有条件处理classname字符串连接的库,非常好用~。简单来说就是动态地去操作类名,把符合条件的类名粘在一起。安装(使用npm)npminstallcl......
  • Altium Designer脚本系统 接口层次关系图
     ISch_ServerInterface层次结构图IPCB_ServerInterface层次关系图IClient层次关系图IntegratedLibraryManager层次关系图INexusWorkbench层次关系图 ......
  • 利用sshpass批量实现基于key验证脚本
    实现基于key验证的脚本1:[root@centos7~]#vim/etc/ssh/ssh_config#免应答known_hostsStrictHostKeyCheckingno[root@centos7~]#cathosts.list192.168.1.21019......
  • shell脚本学习教程(全网最全教学)
     1shell概述1.1什么是ShellShell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便远程远程程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚......
  • Hive使用TRANSFORM运行Python脚本总结
    1、Python环境设置可以使用addcachearchive的方法把tar.gz添加到分布式缓存,Hive会自动解压压缩包,但是目录名是和压缩包名称一样的;addcachearchive${env:my_workbenc......
  • Arthas
    代码热更新jad(JavaDecompile)、sc(SearchClass)、mc(MemoryCompiler)、redefine1.jad--source-only全限定类名>/tmp/HotFix.java2.<Ctrl+d>退出Arth......
  • CWE-79 在Web页面生成时对输入的转义处理不恰当(跨站脚本)
    ImproperNeutralizationofInputDuringWebPageGeneration('Cross-siteScripting')结构:SimpleAbstraction:Base状态:Stable被利用可能性: High基本描述......
  • 使用Openfeign,出现: java.lang.NoClassDefFoundError: org/apache/http/ssl/SSLContext
    之前是好的,后来项目启动,莫名其妙出现这个问题。猜测肯定是包的版本问题。 升级了cloudalibaba和boot-dependencies,发现还是没用。后面查找文章,说是这个版本低了。......
  • struct与class的区别
    之前我解释过struct和class除了在默认的权限方面有一些区别之外就没有区别了,但是这只是c++。在c语言中class可以传递this指针,编译器看到class之后会在代码中用寄存器edx或......