我正在尝试在java应用程序上获取unix(solaris和linux)线程转储。
1)当java应用程序是tomcat web应用程序时, 使用kill -3,转储转到catalina.out文件,因为这是标准输出。 kill -3 pid> td.out不起作用。
2)对于另一个spring独立的java应用程序,如何找到它的标准输出。 我用过: 杀-3 pid,我已经检查了我的应用程序日志,我找不到任何东西。
请告知我如何确定java应用程序的标准输出并查看线程转储。
谢谢, 乙
答案 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;}”显示第二列