我想偶尔通过shell脚本获取java线程转储并将它们附加到文件中,同时允许它们转到catalina.out,这是Java进程指向FD 1的地方。我尝试了kill -3 $(pidof java) |tee -a /dumpfile
但最终得到了一个空文件,因为Java的STDOUT不是我脚本的控制终端。有没有办法在不关闭Java进程的情况下执行此操作并重新启动它的输出重新打开它?带有bash shell的Linux。
答案 0 :(得分:1)
然后试试这个:
终端上的1- in:
tail -f /proc/$(pidof java)/fd/1 | tee -a /dumpfile
2-在另一个终端:
kill -3 $(pidof java)
这假设您对/ proc / java_pid / fd / 1具有读取权限,如果您是root用户,则该文件应为file。
答案 1 :(得分:0)
这是我最终用来捕获和通过电子邮件发送线程转储的解决方案。它没有重定向过程的STDOUT,只是从catalina.out中获取相关信息。
#!/bin/bash
CATOUT=/opt/tomcat/logs/catalina.out
DUMPSTART=$(grep -n dump|tail -n1|cut -d':' -f1)
DUMPEND=$(wc -l $CATOUT|cut -d' ' -f1)
kill -3 $(pidof java)
sed -n "${DUMPSTART},${DUMPEND)p" $CATOUT |mail -s "Java thead dump" myemail@foo.com