以前は、kill -quit を実行してスレッド ダンプを生成し、サーバー ログが存在するログ ファイルにそれらを取得していました。ファイルが大きくなりすぎたので、rm を使用してファイルを削除し、同じ名前の新しいファイルを作成しました。kill -quit を使用してスレッド ダンプを取得すると、ログ ファイルに何もコピーされず、空になります。
誰でも助けることができますか?
以前は、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をファイルにリダイレクトすることです。さらに、デフォルトの設定で見落とされていることの1つは、リダイレクトstdinです。デーモンプロセスの場合、stdinを/ dev/nullにリダイレクトすることをお勧めします。例えば:
nohup $JBOSS_HOME/bin/run.sh $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &
最後に、実行中のプロセスがある場合はjstack
、JREに含まれているを使用してスレッドダンプを取得できます。これは、呼び出されたコンソールに出力されます。からの出力が好きkill -3
ですが、jstack
ネイティブスタックフレームを表示することもできます。
jmx にアクセスして jboss.system:service=Logging,type=Log4jService を見つけた場合は、再構成メソッドを呼び出して、log4j にそのログ ファイルを再度開かせることができます。その後、 kill -quit が機能するはずです。