Java 对不在控制终端中的进程执行重定向

Java 对不在控制终端中的进程执行重定向,java,bash,io-redirection,Java,Bash,Io Redirection,我偶尔会通过一个shell脚本,获取java线程转储并将它们附加到一个文件中,同时也允许它们转到catalina.out,这是java进程指向fd1的地方。我尝试了kill-3$(pidof java)| tee-a/dumpfile,但最终得到了一个空文件,因为java的STDOUT不是我脚本的控制终端。有没有办法不关闭Java进程并在输出重定向的情况下重新打开它?Linux和bash shell。然后尝试以下操作: 1-在终端上: tail -f /proc/$(pidof java)/fd

我偶尔会通过一个shell脚本,获取java线程转储并将它们附加到一个文件中,同时也允许它们转到catalina.out,这是java进程指向fd1的地方。我尝试了
kill-3$(pidof java)| tee-a/dumpfile
,但最终得到了一个空文件,因为java的STDOUT不是我脚本的控制终端。有没有办法不关闭Java进程并在输出重定向的情况下重新打开它?Linux和bash shell。

然后尝试以下操作:

1-在终端上:

tail -f /proc/$(pidof java)/fd/1 | tee -a /dumpfile
kill -3 $(pidof java)
2-在另一个终端:

tail -f /proc/$(pidof java)/fd/1 | tee -a /dumpfile
kill -3 $(pidof java)

这假设您对/proc/java_pid/fd/1具有读取权限,如果您是root用户,则该文件应为file。

以下是我最后用来捕获并通过电子邮件发送线程转储的解决方案。它并没有重定向进程的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