it-swarm.it

jstack: il processo di destinazione non risponde

Sto eseguendo Ubuntu Server Edition e volevo fare un dump di thread di Tomcat.

Quindi, ho prima provato a scoprire quale PID Tomcat utilizza:

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

Ma non c'è?

Quindi, ho usato top invece e ho scoperto il PID 5730.

Quindi ho chiamato jstack per ottenere il dump del thread:

$ 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

Cosa sta succedendo? :

Ho già provato a esportare CATALINA_TMPDIR come descritto in --- (Jstack e Jstat hanno smesso di funzionare con l'aggiornamento a JDK6u2 ma questo non ha cambiato nulla:

$ 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

Aggiornamento:

Ho anche provato Sudo -u Tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt ma mi dà solo tonnellate di eccezioni sulla console.

44
Timo

Ho funzionato facendo due cose:

  1. Chiamata modificata a: Sudo -u Tomcat6 jstack -J-d64 -m pid
  2. Sostituito OpenJDK con i pacchetti Sun-6-jdk e Sun-6-jre originali Sun

Spiegazione per la parte 1: Sono passato alla modalità a 64 bit, ho usato Sudo ed ho eseguito il comando come utente Tomcat.

Nota: Parte 2 potrebbe non essere necessario. Per alcuni utenti sembra che la parte 1 sia sufficiente. In effetti, prova ad aggiungere prima solo il comando Sudo. Potrebbe già fare il trucco.

68
Timo

Penso che sia necessario eseguire jstack come lo stesso utente che esegue il processo Tomcat. Si noti inoltre che jps restituisce solo processi per l'utente corrente. Otterresti il ​​pid per il processo Tomcat eseguendo jps con Sudo o come utente del processo Tomcat.

Questa segnalazione di bug può anche essere utile: https://bugs.launchpad.net/ubuntu/+source/Sun-Java6/+bug/597098

30
Michael Pigg

Trovo utile usare qualcosa come 'ps -eo pid, user, command | grep Java 'per trovare l'attuale Java in uso, quindi utilizzare la directory per trovare il jstack corrispondente ecc.

# 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)

Quindi è a 64 bit, in esecuzione come 'someuser'. su per quell'utente ed eseguire run jstack ecc. dalla stessa directory. (es./usr/lib/jvm/Java/bin/jstack

Utile quando ci si trova su un server con diverse installazioni/implementazioni di Java.

1
Cameron Kerr

Questo ha funzionato anche per me:

Sudo -u Tomcat6 uccide -3 pid

Sembra che non accada nulla, ma quando guardi nei registri ci sono le pile. Sembrano eccezioni se non te li aspetti.

1
Ted Bigham

Prova a passare al processo utente e quindi utilizza jstack:

Sudo -u {processo utente} jstack> dump

1
Joshua

Per gli utenti Tomcat che hanno questo problema, controlla il tuo file di registro catalina.out.

Avevo gli stessi problemi "22693: Impossibile aprire il file socket: il processo di destinazione non risponde o HotSpot VM non caricato". Ho rinunciato e stavo cercando di trovare qualcosa su ciò che è accaduto prima che si bloccasse su, ma poi c'era l'output jstack nel file di registro.

0
John C

Per coloro che trovano questa risposta sei anni dopo che è stata chiesta e sono in CentOS 7 nota che SELinux impedirà a jmap di scrivere i dump dell'heap poiché, immediatamente, negherà la scrittura su un socket a meno che la directory ha il tipo Tomcat_tmp_t.

Nel mio caso, scrivo i miei dump dell'heap in /usr/share/Tomcat/.jmap. Questa directory è di proprietà del mio utente runtime.

Pertanto, per consentire a jmap di scrivere in questa directory:

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

Il che ci consente di eseguire, come nostro utente Tomcat:

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

Ho avuto lo stesso problema, ma nessuno della soluzione di seguito ha funzionato per me:

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

Alla fine ho aggiornato JDK da jdk1.6.0_24 a jdk1.7.0_67 e tutto ha funzionato.

0
MK Aftab