TIL: 用进程树展开定位被脚本包装的 JVM 进程

💡 原文中文,约3500字,阅读约需9分钟。
📝

内容提要

本文介绍了如何使用进程树定位被脚本包装的JVM进程。Kyle Kingsbury提出通过pgrep递归展开进程树,并与jps输出交集来有效定位目标进程。文中还提供了Shell脚本示例,验证了该方法在Clojure测试实例中的有效性。

🎯

关键要点

  • 使用 jstack 调试被脚本包装的 JVM 进程时,jps 输出的信息有限,无法直接关联进程与启动命令。

  • Kyle Kingsbury 提出通过 pgrep 递归展开进程树,并与 jps 输出交集来定位目标进程。

  • 传统方法在进程链较长时不可靠,建议从匹配命令行的根进程开始,使用 pgrep -P <pid> 展开进程树。

  • 提供了 Shell 脚本示例,能够有效找到被脚本包装的 JVM 进程并执行 jstack。

  • 验证方法是搭建一个 Clojure 测试实例,通过 lein run 启动后挂住,使用 jstack+ 定位该进程。

延伸问答

如何定位被脚本包装的JVM进程?

可以使用pgrep递归展开进程树,并与jps输出交集来定位目标进程。

为什么jps输出的信息有限?

jps只能列出正在运行的JVM进程,但无法将这些进程与启动命令关联起来。

提供一个Shell脚本示例来定位JVM进程吗?

可以使用以下Shell脚本:#!/bin/bash # jstack+ - 对匹配命令的进程树中的JVM执行jstack # 用法: jstack+ lein test ...

如何验证jstack+能否找到被脚本包装的JVM进程?

可以搭建一个Clojure测试实例,使用lein run启动后挂住,然后用jstack+定位该进程。

在进程链较长时,传统方法有什么问题?

传统方法在进程链较长时不可靠,容易导致错误的进程识别。

如何使用pgrep展开进程树?

可以使用命令pgrep -P <pid>来递归展开指定PID的进程树。

➡️

继续阅读