获取Unix线程转储

时间:2013-11-06 17:43:56

标签: java linux unix

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

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

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

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

谢谢, 乙

2 个答案:

答案 0 :(得分:4)

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

jstack -l JAVA_PID > jstack.out

答案 1 :(得分:0)

尝试使用Process

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;}”显示第二列