捕获完整的进程结构/堆栈

捕获完整的进程结构/堆栈

服务器上运行着很多java进程,一般我们使用ps -ef | 命令来捕获java进程的PID。 grep java'.一般来说,java进程的结构中有很多jar,如下所示

java -DCORDYS_INSTALL_DIR=/opt/abcd/clouprod01 \
     -cp "/opt/abcd/clouprod01/scp.jar:/opt/abcd/clouprod01/scp.jar:/usr/lib/mysql-connector-java-5.1.22-bin.jar::/usr/lib/mysql-connector-java-5.1.22-bin.jar: com.eibus.tools.admin.cmc" \
     -DProcessName=ABCD

在上面的java进程中,有一些参数作为参数传递给java进程,例如“-DProcessName=ABCD”。

就我而言,对于一些 java 进程,在 java 进程启动时会加载近 50 个 jar 文件。因此,ps 命令的结果没有显示 java 进程的完整结构/堆栈。结果就像

java -DCORDYS_INSTALL_DIR=/opt/abcd/clouprod01 -cp "/opt/abcd/clouprod01/scp.jar:/opt/abcd/clouprod01/scp.jar:

ps任何人都可以帮助我们使用该命令或任何其他命令来跟踪 java 进程的完整结构/堆栈吗?

答案1

在 RHEL/CentOS 的 bash shell 中,这通常是 ps 截断输出的结果。在这种情况下,您可以在 ps 选项中添加两个“w”以获得完整的命令行:

ps -efww | grep java

如果 'w' 选项无法完成或不可用,那么您的 ps 二进制文件很可能有类似的选项可用。

答案2

如果我理解正确的话,您需要该过程的完整命令行。

在 Linux 或 *BSD 下,传递wwps命令以告诉它不要截断命令行。

ps -A ww

-o args您可以通过传递给 来提取参数(包括命令名称)ps

ps -o args -A ww

在 Linux 下,您可以传递-C java仅列出运行名为 的命令的进程java

ps -o args -C java ww

获得无限宽度而不是终端宽度的另一种方法是通过另一个程序进行管道传输。

ps -o args -C java | cat

在Linux下,您可以从进程ID/proc/$pid/cmdline处检索整个进程命令行。$pid命令行是明确存储的,用空字节来分隔参数,因此即使参数包含空格,这也很好。

答案3

使用/proc文件系统来做这类事情。特别是,我认为您会想看看/proc/$PID/maps. “$PID”是有问题的进程 ID。您可以使用类似的方法cat /proc/$PID/maps来获取任何给定 PID 的映射内容的文本版本。cat /proc/self/maps对于初学者:这将向您展示简单的 C 程序映射的内容。

我在 Java 中找到了一个“cat”示例程序,并执行了java cat /proc/self/maps.这个简单的“cat”有大量的“.so”可加载库,但仅rt.jar映射为 .jar 文件。

答案4

如果您碰巧使用 Solaris,则可以使用以下之一获取完整的参数列表:

/usr/ucb/ps -alxww

或者

pargs $pid

请注意,除非您拥有额外的权限(通常是 root),否则您仍然会得到不属于您的进程的截断列表。

不确定您是否真的也想获取进程堆栈,但为了以防万一,显示它的命令是(假设 pid 是一个包含 JVM 进程 ID 的变量):

pstack $pid

相关内容