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



我想偶尔通过shell脚本,获取java线程转储并将它们附加到文件中,同时还允许它们转到catalina。这是FD 1指向Java进程的位置。我尝试了kill -3 $(pidof java) |tee -a /dumpfile,但最终得到了一个空文件,因为Java的STDOUT不是我的脚本的控制终端。有没有办法做到这一点,而不关闭Java进程并重新打开它的输出重定向?Linux使用bash shell

试试这个:

1- in端子:

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

2-在另一个终端:

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 

最新更新