1

我正在尝试在 java 应用程序上获取 unix(solaris 和 linux)线程转储。

1) 当 java 应用程序是 tomcat web 应用程序时,使用 kill -3 ,转储到 catalina.out 文件,因为这是标准输出。kill -3 pid > td.out 不起作用。

2) 对于另一个 spring 独立 java 应用程序,我如何找到它的标准输出。我使用过:kill -3 pid,并且我检查了我的应用程序日志,但我找不到任何东西。

请告知我如何确定 java 应用程序的标准输出并查看线程转储。

谢谢,B。

4

2 回答 2

4

如果您使用的是 OpenJDK 或 Sun JDK 6 或更高版本,请尝试 bin 文件夹中的 jstack 命令。当由于某种原因将标准输出重定向到文件有问题时,这很有用。执行以下命令,传入 Java 进程 ID:

jstack -l JAVA_PID > jstack.out
于 2013-11-06T17:52:31.923 回答
0

尝试使用进程

Process p = null;
String cmd[] = {"bash","-c","ps -C java | awk '{ print $1; }' | sed -n '2{p;q;}'"};
try
{
p = Runtime.getRuntime().exec(cmd);
try
{
p.waitFor();
System.out.println("Executed Successfully");
}catch(Exception e)
 {
e.printStackTrace();
}

}catch(Exception e)
{
e.printStackTrace();
}

然后通过 BufferReader 读取该行并使用上面的函数杀死并输出相同

命令说明:

ps -C java | awk '{ print $1; }' | sed -n '2{p;q;}'

“ ps -C ProcessName ”告诉进程是否使用pid运行,这里Java用作ProcessName

" awk '{ print $1; }' " 输出输出的第一行

“ sed -n '2{p;q;} ” 显示第二列

于 2013-11-06T18:31:52.913 回答