Подтвердить что ты не робот

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

Что происходит?: - (

Я уже пытался экспортировать CATALINA_TMPDIR, как описано в Jstack, и Jstat перестал работать с обновлением до JDK6u23, но это ничего не изменило:

$ 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

Update:

Я также пробовал sudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt, но это только дает мне массу исключений на консоли.

4b9b3361

Ответ 1

Я заработал, выполнив две вещи:

  • Измененный вызов: sudo -u tomcat6 jstack -J-d64 -m pid
  • Заменили OpenJDK на Sun-sun-6-jdk и sun-6-jre пакеты.

Объяснение для части 1: Я переключился на 64-битный режим, использовал sudo и выполнил команду как пользователь Tomcat.

Примечание. Часть 2 может и не понадобиться. Для некоторых пользователей кажется, что часть 1 достаточно. На самом деле сначала попробуйте добавить команду sudo. Возможно, это уже трюк.

Ответ 2

Я думаю, вам нужно запустить jstack как тот же пользователь, который запускает процесс Tomcat. Также обратите внимание, что jps возвращает процессы только для текущего пользователя. Вы получите pid для процесса Tomcat, запустив jps с помощью sudo или как пользователь процесса Tomcat.

Этот отчет об ошибке также может быть полезен: https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/597098

Ответ 4

Это также помогло мне:

sudo -u tomcat6 kill -3 pid

Похоже, что ничего не происходит, но когда вы смотрите в журналы, там находятся стеки. Они выглядят как исключения, если вы их не ожидаете.

Ответ 5

Я считаю полезным использовать что-то вроде 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)

Итак, его 64-бит, работающий как "someuser". su к этому пользователю и запустить jstack запуска и т.д. из того же каталога. (т.е./usr/lib/jvm/java/bin/jstack

Полезно, когда вы находитесь на сервере с различными установками/реализациями Java.

Ответ 6

Попробуйте переключиться на процесс пользователя, а затем используйте jstack:

sudo -u {process user} jstack > dump

Ответ 7

У меня была такая же проблема, но none ниже решения работал у меня:

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

Наконец, я обновил JDK от jdk1.6.0_24 до jdk1.7.0_67 и все работало.

Ответ 8

Для пользователей Tomcat, имеющих эту проблему, проверьте файл журнала catalina.out.

У меня были те же проблемы "22693: Не удалось открыть файл сокета: целевой процесс не отвечает, а HotSpot VM не загружен". Я сдался и пытался найти что-либо о том, что произошло до его запирания, но затем в файле журнала появился файл jstack.