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は次のとおりです。
jstack
コマンドが機能しないのはいつですか?前もって感謝します。
これはおそらく、jstackが取得するものとは異なる許可を持つプロセスとの通信に使用される/ tmp内のファイルが原因です。問題のファイルは/ tmp/hsperfdata_ $ USER/$ PIDです。
マニュアルページに「 'jstack [-l] pid'が応答しない場合にスタックダンプを強制する」とだけ書かれているため、なぜ-Fで動作するのかわかりません。
-F
を使用すると、jvmはfrozenになります。
file: /tmp/hsperfdata_$USER/$PID
が見つかったら。 $USER
に切り替えてから、exec jstack
に切り替えてください。 「root」で実行していますが、そのプロセスはルートに属していない可能性があります。
$USER
にログインシェル(つまり、デーモンユーザー)がないため、そのユーザーに切り替えることができない場合は、Sudo -u $USER jstack $PID
を使用してこの問題を回避できます。
jstack
をroot
として実行しようとしたときにこの問題が発生しました。
別のユーザーに切り替えるとすぐに動作しました。
すべてのアプリがデフォルトのアプリを使用するわけではないため、-Jオプションで/ tmpディレクトリを指定する必要がある場合があることを付け加えます。
jstack -J-Djava.io.tmpdir=PATH -l PID
私は同じエラーを実行していました:
watch -n .5 "jstack 26259"
Sudoとして動作します:
Sudo watch -n .5 "jstack 26259"
ユーザーについて心配する必要がなく、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
おそらく最も簡単な方法は次のとおりです。
ps -efでプロセスの所有者を確認します| grep "プロセス名"
次に、そのユーザーに切り替えてコマンドを実行します。
jcmd PID GC.runまたはその他のJavaユーティリティ
ここで誰も議論していないことに気づいたのは、また、Java_HOME変数を設定する必要があります。 echo $ Java_HOMEでこれを確認してください
同じユーザーで実行することに加えて、jstack/jmapを実行しているユーザーのグループIDもプロセスと同じであることを確認してください。
ファイルのアクセス許可をチェックするソースコード (347行目)を見てください。グループIDを取得する関数は配列ではないため、ユーザーがプロセスを開始した他のグループを持っている可能性があります。
ユーザーからプライマリグループを変更する必要がある場合があります。
#usermod -g group -G user user
これは、常に正しいユーザー権限を使用していることを確認するために使用する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
Jstackを正常に使用するには、プロセスと同じユーザーで実行する必要があります。