Arthas session 命令完全指南:查看当前会话绑定的 Java 进程 PID 与会话 ID
【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas
Arthas 是阿里巴巴开源的 Java 诊断工具,session命令用于查看当前诊断会话(session)的详细信息,包括当前绑定的 Java 进程 PID(JAVA_PID)和会话 ID(SESSION_ID)。本文基于 英文官方文档(中文版本见 site/docs/doc/session.md),并结合 Arthas 核心源码(core 模块)深入讲解该命令的字段含义、底层实现与典型排查场景,帮助你在多进程、多会话、Tunnel 远程连接等复杂环境中快速确认自己"连的是谁、会话是否健康"。
命令用途概述
session命令不带任何参数,执行后会在终端中以表格形式打印当前会话的状态信息。它的核心价值在于:
- 确认当前 Arthas 会话绑定的是哪一个 Java 进程(通过
JAVA_PID字段); - 获取当前会话的唯一标识(
SESSION_ID),该标识可用于后续会话管理、日志排查与多会话区分; - 在配置了 Tunnel Server 或 statUrl 统计的情况下,追加展示代理 ID、Tunnel 服务器地址、连接状态与统计上报地址,帮助定位"会话是否真的连上了远程 Tunnel"等连接类问题。
基本用法与输出解读
在 Arthas 交互终端中直接输入:
$ session Name Value -------------------------------------------------- JAVA_PID 14584 SESSION_ID c2073d3b-443a-4a9b-9249-0c5d24a5756c输出为两列:Name(字段名)与Value(字段值)。基础输出包含两个固定字段:
| 字段名 | 含义 |
|---|---|
JAVA_PID | 当前 Arthas 会话所绑定(attach)的 Java 进程的 PID,即被诊断应用的操作系统进程号 |
SESSION_ID | 当前会话的唯一标识,格式为 UUID 字符串,如c2073d3b-443a-4a9b-9249-0c5d24a5756c |
这两个字段是恒定输出的。从源码看,SessionCommand.java 中通过session.getPid()与session.getSessionId()直接读取当前会话对象(Session 接口)中的进程号与会话 ID 并填充到结果模型SessionModel中。
条件字段:Tunnel Server 与 statUrl 场景下的扩展输出
官方文档明确指出:session的输出并非固定不变,而是随运行环境条件动态追加:
- 如果配置了 Tunnel Server,会追加显示代理 ID(
AGENT_ID)、Tunnel 服务器地址(TUNNEL_SERVER)以及连接状态(TUNNEL_CONNECTED); - 如果使用了 statUrl 做统计上报,会追加显示
STAT_URL字段。
对应地,在 SessionView.java 的渲染逻辑中,各字段均为条件渲染:
table.row("JAVA_PID", "" + result.getJavaPid()).row("SESSION_ID", "" + result.getSessionId()); if (result.getAgentId() != null) { table.row("AGENT_ID", "" + result.getAgentId()); } if (result.getTunnelServer() != null) { table.row("TUNNEL_SERVER", "" + result.getTunnelServer()); table.row("TUNNEL_CONNECTED", "" + result.isTunnelConnected()); } if (result.getStatUrl() != null) { table.row("STAT_URL", result.getStatUrl()); } if (result.getUserId() != null) { table.row("USER_ID", result.getUserId()); }也就是说,只有在对应数据存在时才输出对应行。完整的条件字段说明如下:
| 字段名 | 出现条件 | 含义 |
|---|---|---|
AGENT_ID | 配置了 Tunnel Server 且 TunnelClient 已持有代理 ID | 当前 Arthas Agent 在 Tunnel Server 侧注册的代理标识 |
TUNNEL_SERVER | 配置了 Tunnel Server | Tunnel 服务器的 URL 地址 |
TUNNEL_CONNECTED | 配置了 Tunnel Server | 与 Tunnel 服务器的连接是否已建立(true/false) |
STAT_URL | 配置了 statUrl 统计地址 | 会话使用统计上报的 URL 地址 |
USER_ID | 会话设置了用户标识 | 当前会话关联的用户 ID(如通过鉴权或--auth机制绑定的用户) |
在命令实现中,这些字段来自三个数据源(SessionCommand.java):
- TunnelClient:通过
ArthasBootstrap.getInstance().getTunnelClient()获取 Tunnel 客户端实例,读取getId()、getTunnelServerUrl()、isConnected()三个值; - UserStatUtil:通过
UserStatUtil.getStatUrl()读取统计上报地址; - Session 对象:通过
session.getUserId()读取用户标识。
由此可以推断:只有显式配置并启用了 Tunnel 或统计上报,session才会输出对应的扩展字段;普通本地直连场景下只会看到JAVA_PID与SESSION_ID两行。关于 Tunnel 的完整配置方式,可参考 Tunnel 文档(英文) 或 Tunnel 文档(中文)。
从源码看session命令的实现链路
session命令是一个标准的 Arthas 注解命令(AnnotatedCommand),声明位于 basic1000 命令包中:
@Name("session") @Summary("Display current session information") public class SessionCommand extends AnnotatedCommand { @Override public void process(CommandProcess process) { SessionModel result = new SessionModel(); Session session = process.session(); result.setJavaPid(session.getPid()); result.setSessionId(session.getSessionId()); // tunnel TunnelClient tunnelClient = ArthasBootstrap.getInstance().getTunnelClient(); if (tunnelClient != null) { String id = tunnelClient.getId(); if (id != null) { result.setAgentId(id); } result.setTunnelServer(tunnelClient.getTunnelServerUrl()); result.setTunnelConnected(tunnelClient.isConnected()); } // statUrl String statUrl = UserStatUtil.getStatUrl(); result.setStatUrl(statUrl); // userId String userId = session.getUserId(); result.setUserId(userId); process.appendResult(result); process.end(); } }其完整调用链为:
- 命令入口:
SessionCommand.process()执行,从CommandProcess中取出当前Session; - 数据组装:将 PID、SESSION_ID、Tunnel 信息、statUrl、userId 组装进
SessionModel; - 结果分发:
process.appendResult(result)将模型对象交给结果分发器; - 终端渲染:终端/TTY 场景由 SessionView.java 渲染为上述表格输出(HTTP API 等其他分发渠道则直接消费模型数据)。
会话 ID 是怎么生成的
SESSION_ID采用 UUID 格式,其生成逻辑位于会话管理器 SessionManagerImpl.java:
String sessionId = UUID.randomUUID().toString();每次用户连接并建立新的 Arthas 会话时,都会生成一个全新的随机 UUID 作为会话标识;同时 ShellImpl.java 中 shell 自身的id同样由UUID.randomUUID().toString()生成,用于区分不同的 shell 实例。这意味着:
- 同一个 Arthas Server(同一个被诊断 JVM)可以同时承载多个会话,每个会话有独立的
SESSION_ID; SESSION_ID不随JAVA_PID变化——同一进程重新 attach 会得到新的会话 ID,而同一个会话始终对应固定 ID。
典型使用场景
场景一:确认当前会话绑定的进程
当服务器上运行多个 Java 应用、或使用脚本批量 attach 时,先执行session确认JAVA_PID是否与预期进程一致,避免误诊断。
场景二:排查 Tunnel 远程连接状态
通过 Tunnel Server 远程连接 Arthas 时,若诊断命令无响应或行为异常,执行session观察TUNNEL_CONNECTED是否为true、TUNNEL_SERVER是否为预期地址,可快速区分"连接已断开"与"业务本身无响应"两类问题。
场景三:核对统计上报配置
配置了 statUrl 做使用统计时,通过STAT_URL字段核对上报地址是否正确生效,无需翻阅配置文件。
场景四:多会话区分与日志关联
在排查 Arthas 自身的日志、或同时打开多个诊断会话时,用SESSION_ID作为唯一键关联对应会话的输出与状态。
小结
session是 Arthas 中轻量但高频使用的诊断命令:它没有复杂参数,通过一张动态表格输出当前会话的核心身份信息(JAVA_PID、SESSION_ID),并在 Tunnel、统计、鉴权等扩展场景下追加AGENT_ID、TUNNEL_SERVER、TUNNEL_CONNECTED、STAT_URL、USER_ID等条件字段。结合 SessionCommand.java 与 SessionView.java 的实现,可以准确理解每个字段的数据来源与输出条件,从而在本地直连与远程 Tunnel 两类典型部署形态下,快速完成"当前会话是谁、连到哪、是否健康"的确认。
【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考