49

32 ビットの Oracle Java 1.6.0 を使用して、x86_64 CentOS 5.7 で tomcat 5.5 を実行しています。

Tomcat が使用する JVM プロセスの pid は 6421 です。Tomcat は正常に動作しています。

実行するjstackと、次のように失敗します。

[root@mybox ~]# jstack 6421
6421: well-known file is not secure

妥当な出力を得るには、強制オプションを使用する必要があります。

[root@mybox ~]# jstack -F 6421
Attaching to process ID 6421, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
Deadlock Detection:

No deadlocks found.
(...)

質問は次のとおりです。

  1. 「well-known file is not secure」というエラー メッセージはどういう意味ですか?
  2. 「よく知られている」ファイルとは何ですか?
  3. jstack強制オプションなしでコマンドが機能しないのはなぜ/いつですか?

前もって感謝します。

4

11 に答える 11

37

これはおそらく、プロセスとの通信に使用される /tmp 内のファイルが、 jstackが取得する権限とは異なる権限を持つためです。問題のファイルは /tmp/hsperfdata_$USER/$PID です。

マニュアルページに「「jstack [-l] pid」が応答しない場合にスタックダンプを強制する」とだけ記載されているため、-F で機能する理由がわかりません。

于 2012-02-01T17:46:39.910 に答える
25

-F使用すると、jvmフリーズします。

を見つけることができればfile: /tmp/hsperfdata_$USER/$PID。に切り替えてみて$USERくださいexec jstack「 root 」で実行していますが、そのプロセスは root に属していない可能性があります。

$USERログイン シェル (つまり、デーモン ユーザー) がなく、そのユーザーに切り替えることができない場合は、次を使用してこれを回避できます。sudo -u $USER jstack $PID

于 2012-04-17T09:15:18.143 に答える
7

jstackとして実行しようとしたときに、この問題が発生しましたroot

別のユーザーに切り替えると、すぐに機能しました。

于 2016-06-16T11:52:54.620 に答える
3

すべてのアプリがデフォルトのものを使用しているわけではないため、 -J オプションで /tmp ディレクトリを指定する必要があるかもしれないことを付け加えたいと思います

jstack -J-Djava.io.tmpdir=PATH -l PID
于 2013-05-14T01:27:10.970 に答える
1

実行中に同じエラーが発生しました:

watch -n .5 "jstack 26259"

sudo として実行すると動作します:

sudo watch -n .5 "jstack 26259"
于 2015-05-15T20:55:10.787 に答える
0

jstack を正常に使用するには、プロセスと同じユーザーで実行する必要があります。

于 2018-04-02T03:53:44.407 に答える
0

おそらく最も簡単な方法は次のとおりです。

ps -ef | でプロセスの所有者を確認します。grep "プロセス名"

次に、そのユーザーに切り替えてコマンドを実行します。

jcmd PID GC.run またはその他の Java ユーティリティ

ここで誰も議論していないことに気付いたのは、次のとおりです。また、JAVA_HOME 変数を設定する必要があります。echo $JAVA_HOME でこれを確認してください

于 2017-10-13T14:49:27.400 に答える