我编写了一个命令行,可以有效地从 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)