arthas源码刨析:启动 (1)

2024-08-22 11:04
文章标签 源码 启动 arthas 刨析

本文主要是介绍arthas源码刨析:启动 (1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • arthas-boot
    • Bootstrap

在这里插入图片描述

Created with Raphaël 2.3.0 开始 检查监听端口 jps 列表java应用 下载 lib 依赖 功能移交给 arthas-core 结束

arthas-boot

该module 的代码只有3个类:
在这里插入图片描述

Bootstrap

启动类 Bootstrap ,开头的注解就是 alibaba 的 cli 中间件,和 picocli 蛮像。
在这里插入图片描述
arthas 在一些命令的执行需要有 JDK 命令的支持,以 ProcessUtils.select 为例,该方法实际上是要调用JAVA_HOME 下的 jps

jps -l

		long pid = bootstrap.getPid();// select pidif (pid < 0) {try {pid = ProcessUtils.select(bootstrap.isVerbose(), telnetPortPid, bootstrap.getSelect());} catch (InputMismatchException e) {System.out.println("Please input an integer to select pid.");System.exit(1);}if (pid < 0) {System.out.println("Please select an available pid.");System.exit(1);}}

选择 pid 后下载相关依赖:
在这里插入图片描述
在这里插入图片描述
后面就是启动关键模块 arthas-core
在这里插入图片描述
也就是说又启动了一个java进程:
在这里插入图片描述
这就理解了 arthas 提升要用 stop 命令来推出,而不是关闭当前命名窗口,它是个多进程应用。
在这里插入图片描述

之后构建 ProcessBuilder 执行命令:

        // "${JAVA_HOME}"/bin/java \// ${opts} \// -jar "${arthas_lib_dir}/arthas-core.jar" \// -pid ${TARGET_PID} \// -target-ip ${TARGET_IP} \// -telnet-port ${TELNET_PORT} \// -http-port ${HTTP_PORT} \// -core "${arthas_lib_dir}/arthas-core.jar" \// -agent "${arthas_lib_dir}/arthas-agent.jar"

并将进程的标准输出、标准错误进行重定向:

ProcessBuilder pb = new ProcessBuilder(command);// https://github.com/alibaba/arthas/issues/2166pb.environment().put("JAVA_TOOL_OPTIONS", "");try {final Process proc = pb.start();Thread redirectStdout = new Thread(new Runnable() {@Overridepublic void run() {InputStream inputStream = proc.getInputStream();try {IOUtils.copy(inputStream, System.out);} catch (IOException e) {IOUtils.close(inputStream);}}});Thread redirectStderr = new Thread(new Runnable() {@Overridepublic void run() {InputStream inputStream = proc.getErrorStream();try {IOUtils.copy(inputStream, System.err);} catch (IOException e) {IOUtils.close(inputStream);}}});redirectStdout.start();redirectStderr.start();redirectStdout.join();redirectStderr.join();int exitValue = proc.exitValue();if (exitValue != 0) {AnsiLog.error("attach fail, targetPid: " + targetPid);System.exit(1);}

最终看到这个:
在这里插入图片描述

这篇关于arthas源码刨析:启动 (1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096085

相关文章

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of