48

Ubuntu Server Editionを実行していて、Tomcatのスレッドダンプを取得したいと思いました。

そこで、私は最初にどのPIDTomcatが使用しているかを調べようとしました。

$ jps -l
5809 sun.tools.jps.Jps

しかし、それはありませんか?

そこで、top代わりに使用して、PID5730を見つけました。

次に、jstackを呼び出してスレッドダンプを取得しました。

$ sudo jstack -l 5730
5730: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

どうしたの?:-(

Jstackで説明されているようにCATALINA_TMPDIRをエクスポートしようとしましたが、JstatはJDK6u23へのアップグレードで動作を停止しましたが、何も変わりませんでした。

$ export CATALINA_TMPDIR=/tmp
$ sudo /etc/init.d/tomcat6 restart
 * Stopping Tomcat servlet engine tomcat6
   ...done.
 * Starting Tomcat servlet engine tomcat6
   ...done.
$ sudo jstack -l 5934 // new PID after restart
5934: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

アップデート:

私も試しsudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txtましたが、コンソールに大量の例外が表示されるだけです。

4

10 に答える 10

75

私は2つのことをすることによってそれを機能させました:

  1. 呼び出しを次のように変更しました:sudo -u tomcat6 jstack -J-d64 -m pid
  2. OpenJDKをSunの元のsun-6-jdkおよびsun-6-jreパッケージに置き換えました

パート1の説明: 64ビットモードに切り替え、sudoTomcatユーザーとしてコマンドを使用して実行しました。

注:パート2は必要ない場合があります。一部のユーザーにとっては、パート1で十分なようです。sudo実際、最初にコマンドだけを追加してみてください。それはすでにトリックを行うかもしれません。

于 2011-09-28T15:16:03.707 に答える
33

Tomcat プロセスを実行するのと同じユーザーとして jstack を実行する必要があると思います。jps は現在のユーザーのプロセスのみを返すことにも注意してください。Tomcat プロセスの pid を取得するには、sudo を使用して jps を実行するか、Tomcat プロセス ユーザーとして実行します。

このバグレポートも役立つ場合があります: https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/597098

于 2011-09-14T18:10:07.660 に答える
3

プロセス ユーザーに切り替えてから、jstack を使用してみてください。

sudo -u {プロセス ユーザー} jstack > ダンプ

于 2015-07-21T02:49:29.000 に答える
1

これも私のために働いた:

sudo -u tomcat6 kill -3 pid

何も起こらないように見えますが、ログを見るとスタックがあります。予期していない場合、それらは例外のように見えます。

于 2012-04-05T01:53:51.320 に答える
0

私は同じ問題を抱えていましたが、以下の解決策はどれもうまくいきませんでした:

jstack <pid>
jstack -J-d64 -m <pid>
sudo -u <user> jstack ...

最終的にJDKをjdk1.6.0_24からjdk1.7.0_67にアップグレードし、すべてが機能しました。

于 2014-11-08T14:01:21.550 に答える