Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将top命令返回的PID值转换为十六进制?_Linux_Shell - Fatal编程技术网

Linux 如何将top命令返回的PID值转换为十六进制?

Linux 如何将top命令返回的PID值转换为十六进制?,linux,shell,Linux,Shell,我正在运行top命令,希望将PID十进制值转换为相应的十六进制值 我试图捕获JVM进程产生的JAVA子进程或线程,作为标准诊断过程的一部分,以解决应用程序服务器实例(如WebLogic)的问题 诊断包括运行一些命令,如top、lsof、jcmd来捕获堆/线程转储等。线程转储提供了该服务器上当前运行的线程堆栈列表。每个线程由其十六进制的“nid”标识 另一方面,top命令out将列出在该服务器上运行的LWP(轻量级进程),这些进程按CPU/内存使用情况排序。我希望PID在top命令输出中以十六进制

我正在运行top命令,希望将PID十进制值转换为相应的十六进制值

我试图捕获JVM进程产生的JAVA子进程或线程,作为标准诊断过程的一部分,以解决应用程序服务器实例(如WebLogic)的问题

诊断包括运行一些命令,如top、lsof、jcmd来捕获堆/线程转储等。线程转储提供了该服务器上当前运行的线程堆栈列表。每个线程由其十六进制的“nid”标识

另一方面,top命令out将列出在该服务器上运行的LWP(轻量级进程),这些进程按CPU/内存使用情况排序。我希望PID在top命令输出中以十六进制值返回。然后可以在线程堆栈转储中隔离具有与十六进制值匹配的nid的线程

top -Hbn3 -p 10258 |sed -n '/PID/,/^$/p' | awk '{print $1}' | sed '/PID/d' > pids.txt

( echo "obase=16" ; cat pids.txt ) | bc

top-Hbn3-p10258返回由进程id 10258生成的所有PID。结果被捕获三次。请参阅top命令的-n3选项

使用sed和awk的组合,我成功地提取了第一列“PID”,并将值转换为十六进制。但我需要top命令返回的所有原始信息。换句话说,CPU/Mem usage columns timestamp等。只有PID列需要十六进制

实际结果:

$ top -Hbn3 -p 17941
top - 16:47:31 up 267 days, 19:09,  1 user,  load average: 0.13, 0.03, 0.01
Tasks:  88 total,   0 running,  88 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.8%us,  0.5%sy,  0.0%ni, 98.6%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3925316k total,  3671784k used,   253532k free,   169504k buffers
Swap:  8388604k total,   214948k used,  8173656k free,  1482452k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18186 dsadmwl   20   0 2313m 787m  11m S  2.0 20.6  82:17.19 java
17941 dsadmwl   20   0 2313m 787m  11m S  0.0 20.6   0:00.00 java
17943 dsadmwl   20   0 2313m 787m  11m S  0.0 20.6   0:01.25 java

我希望PID值是十六进制的。所有其他信息都需要保留。

下面的bash脚本一次读取一行输出,如果以数字序列开头,则将其转换为十六进制。所有其他信息都直接反映出来

#!/bin/bash
while read -r zLine || [ -n "$zLine" ]; do
 declare zDeci="$(sed -nE 's/^([0-9]*).*/\1/p' <<< "$zLine")"
 [ -n "$zDeci" ] \
  && printf '%x%s\n' "$zDeci" "${zLine:${#zDeci}}" \
  || printf '%s\n' "$zLine"
done < <(your-command-which-makes-output)
!/bin/bash
在阅读时-r zLine | |[-n“$zLine”];做

declare zDeci=“$(sed-nE's/^([0-9]*)./\1/p)”这太棒了。它完全按照我的预期工作。非常感谢您在注释中提供的指针。