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

时间:2014-05-15 17:53:56

标签: java bash io-redirection

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

2 个答案:

答案 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