web-dev-qa-db-ja.com

jstack:ターゲットプロセスが応答しない

Ubuntuサーバー版を実行していますが、Tomcatのスレッドダンプを取得したかったのです。

そこで、私は最初にどのPID Tomcatが使用しているかを見つけようとしました:

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

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

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

次に、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とJstatはJDK6u23へのアップグレードで動作を停止しました で説明されているように、すでにCATALINA_TMPDIRをエクスポートしようとしましたが、それは何も変更しませんでした:

$ 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しかし、それはコンソール上で私にたくさんの例外を与えるだけです。

44
Timo

私は2つのことをしてそれを機能させました:

  1. 変更された呼び出し:Sudo -u Tomcat6 jstack -J-d64 -m pid
  2. OpenJDKをSunのオリジナルのSun-6-jdkおよびSun-6-jreパッケージに置き換えました

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

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

68
Timo

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

このバグレポートも役に立つかもしれません: https://bugs.launchpad.net/ubuntu/+source/Sun-Java6/+bug/597098

30
Michael Pigg

@Valmar、私は同じトピック投稿をここに見つけます。 スレッドダンプを取得できませんか?アプリがブロックする理由はありますか?

回避策はSudo -u Tomcat6 kill -3 <pid>

3
Clark Bao

'ps -eo pid、user、command |のようなものを使用すると便利です。 grep Java 'を使用して実際のJavaコマンドが使用されていることを確認してから、ディレクトリを使用して一致するjstackなどを見つけます。

# ps -eo user,command | grep '[j]ava' | cut -d' ' -f1
someuser /usr/lib/jvm/Java/bin/Java

# /usr/lib/jvm/Java/bin/Java -version
Java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

そのため、「someuser」として実行される64ビット。そのユーザーに対してsuを実行し、同じディレクトリからjstackなどを実行します。 (つまり、/ usr/lib/jvm/Java/bin/jstack

Javaのさまざまなインストール/実装を備えたサーバー上にいる場合に役立ちます。

1
Cameron Kerr

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

Sudo -u Tomcat6 kill -3 pid

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

1
Ted Bigham

処理ユーザーに切り替えてからjstackを使用してみてください。

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

1
Joshua

この問題が発生しているTomcatユーザーの場合は、catalina.outログファイルを確認してください。

「22693:ソケットファイルを開くことができません:ターゲットプロセスが応答しない、またはHotSpot VM not loaded]」という問題が発生していました。ただし、ログファイルにjstackの出力がありました。

0
John C

質問されてから6年後にこの回答を見つけた人たちはCentOS 7 SELinuxはjmapがヒープダンプを書き込むのを止めて、箱から出してすぐにソケットへの書き込みを拒否することに注意してくださいディレクトリのタイプはTomcat_tmp_tです。

私の場合、/usr/share/Tomcat/.jmapの下にヒープダンプを書き込みます。このディレクトリは、ランタイムユーザーが所有しています。

したがって、jmapがこのディレクトリに書き込むことを許可するには:

semanage fcontext -a -t Tomcat_tmp_t "/usr/share/Tomcat/.jmap(/.*)?"
restorecon /usr/share/Tomcat -vR

これにより、Tomcatユーザーとして実行できます。

jmap -dump:format=b,file=/usr/share/Tomcat/.jmap/Tomcat-`date +%s`.bin <pid>
0
Ron

私は同じ問題を抱えていましたが、none以下の解決策が私のために働いた:

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

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

0
MK Aftab