web-dev-qa-db-ja.com

jstack-既知のファイルは安全ではありません

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

Tomcatが使用するJVMプロセスには6421 pidがあります。 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.
(...)

questionsは次のとおりです。

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

前もって感謝します。

42
Michał Šrajer

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

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

33
Roger Lindsjö

-Fを使用すると、jvmfrozenになります。

file: /tmp/hsperfdata_$USER/$PIDが見つかったら。 $USERに切り替えてから、exec jstackに切り替えてください。 「root」で実行していますが、そのプロセスはルートに属していない可能性があります。

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

23
Evans Y.

jstackrootとして実行しようとしたときにこの問題が発生しました。

別のユーザーに切り替えるとすぐに動作しました。

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

jstack -J-Djava.io.tmpdir=PATH -l PID
3
iddqd

私は同じエラーを実行していました:

watch -n .5 "jstack 26259"

Sudoとして動作します:

Sudo watch -n .5 "jstack 26259"
1
Alper Akture

ユーザーについて心配する必要がなく、rootとして作業でき、プロセスを強制終了できる場合は、この最後の手段を使用できます。

kill -s SIGQUIT $PID

これにより、たとえばTomcatの場合、logs/catalina.outのスレッドダンプの開始である「フルスレッド」のgrepを必要とするコンソールログにスレッドダンプが書き込まれ、次のようにtdumpファイルが取得されます。

DUMP_IDX=`grep -n 'Full thread' logs/catalina.out | tail -1 | cut -d':' -f1`
sed -n $DUMP_IDX,1000000000000000000p logs/catalina.out > jstack-kill-thread-dump-0309.tdump
1
kisna

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

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

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

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

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

0
Mr Kashyap

同じユーザーで実行することに加えて、jstack/jmapを実行しているユーザーのグループIDもプロセスと同じであることを確認してください。

ファイルのアクセス許可をチェックするソースコード (347行目)を見てください。グループIDを取得する関数は配列ではないため、ユーザーがプロセスを開始した他のグループを持っている可能性があります。

ユーザーからプライマリグループを変更する必要がある場合があります。

#usermod -g group -G user user

0
Ricardo Zanini

これは、常に正しいユーザー権限を使用していることを確認するために使用する1つのライナーです。

proc="my-process-name"; pid=`pgrep -f "${proc}"`; Sudo -u "#`ps axo uid,pid | grep "${pid}" | tr -s " " | cut -f2 -d" "`" /usr/bin/jstack -l "${pid}" > /mnt/dumps/"${proc}"-`date +%s`.txt
0
douglaslps

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

0
Suyash Jain