将 PID 通过管道传输到 jstack

将 PID 通过管道传输到 jstack

我编写了一个命令行,可以有效地从 top -H 中提取最高 CPU java PID 线程进程(示例代码):

top -H -n 1 | grep "java" | head -n 1 | cut -d' ' -f1

我想检查jstack中的PID。由于线程出现和消失的速度很快,所以不可能手动输入 PID,我希望将结果直接通过管道传输到 jstack 中,但是每当有人这样做时,例如(重现该问题的最简单的代码示例):

12345 | jstack

jstack 只是抛出使用帮助页面,就好像 Pipe 没有将变量发送到 jstack 一样。

如何将通过命令获得的 PID 获取到 jstack 中?

答案1

jstack期望将进程 ID 作为参数提供,因此您应该使用命令替换:

jstack "$(top -H -n 1 | grep "java" | head -n 1 | cut -d' ' -f1)"

您可以使用ps查找进程而不是过滤top输出:

jstack "$(ps -C java -o pid --sort %cpu --no-headers | head -n 1)"

这用于ps查找命令匹配的进程java,仅输出其 PID,按 CPU 使用率排序,没有标头,并保留第一个;结果被赋予jstack.

寻找使用最多CPU的线程ID,改为输出tid,并可选择-L处理ps线程:

ps -L -C java -o tid --sort %cpu --no-headers | head -n 2

(我提取前两个是因为第一个始终与 PID 匹配,PID 将进程的所有 CPU 使用情况分组为一个整体)。

您可以使用printf以十六进制输出:

printf "%x\n" $(ps -L -C java -o tid --sort %cpu --no-headers | head -n 2)

相关内容