在JBoss上没有生成线程转储

时间:2009-04-02 02:48:26

标签: java jboss jvm thread-dump

我曾经通过运行kill -quit来生成线程转储,我会将它们放在我的服务器日志所在的日志文件中。当文件变得太大时,我使用rm删除它并创建了一个同名的新文件。 现在当我使用kill -quit来获取线程转储时,没有任何东西被复制到日志文件中 - 它是空的。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

Unix上的默认JBoss启动脚本通常类似于:

nohup $JBOSS_HOME/bin/run.sh $JBOSS_OPTS >/dev/null 2>&1 &

这很不幸,因为它将stderr发送到/ dev / null。通常这不是问题,因为一旦log4j初始化,那么大多数应用程序输出将转到boot.log或server.log。但是,对于线程转储和其他低级错误,它们会丢失。

最好的办法是更改启动脚本,将stdout和stderr重定向到文件。此外,默认设置中忽略的一件事是重定向stdin。对于守护进程,最好将stdin重定向到/ dev / null。例如:

nohup $JBOSS_HOME/bin/run.sh $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &

最后,如果您有正在运行的进程,则可以使用JRE附带的jstack来获取线程转储。这将输出到调用它的控制台。我更喜欢kill -3的输出,但jstack也允许您查看本机堆栈帧。

答案 1 :(得分:1)

如果这是在* nix上,当您删除文件时,仍然打开该文件的每个人都将继续写入旧的(现在丢失的)文件。只有当文件的所有文件句柄都关闭时,才会真正删除该文件。

您必须使JVM关闭并重新打开日志文件。不确定是否可以在不重启的情况下完成。

答案 2 :(得分:1)

如果你进入jmx并找到jboss.system:service = Logging,输入= Log4jService然后你可以调用reconfigure方法,这会导致log4j重新打开它的任何日志文件。然后kill -quit应该可以工作。