我曾经通过运行kill -quit生成线程转储,然后将它们保存在服务器日志所在的日志文件中。当文件太大时,我使用rm将其删除,并创建了一个同名的新文件。
现在,当我使用kill -quit进行线程转储时,日志文件中没有任何内容被复制-它为空。
有人可以帮忙吗?
最佳答案
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重定向到/ 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
也允许您查看本机堆栈帧。