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

Обновление:

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


person Timo Ernst    schedule 14.09.2011    source источник
comment
Вы пробовали опцию -F?   -  person Michael Pigg    schedule 14.09.2011
comment
@Michael. Если я использую параметр -F, он фактически запускает дамп потока, но сам дамп просто содержит много сообщений об ошибках: dl.dropbox.com/u/17844821/zeug/threaddump.txt и во время процесса сброса создается множество исключений: dl.dropbox.com/u/17844821/zeug/threaddumpexception.txt   -  person Timo Ernst    schedule 15.09.2011
comment
@valmar Возможно ли, что jdk, используемый Tomcat, и jdk, который вы используете для jps, не совпадают с jdk? Не могли бы вы это дважды проверить?   -  person Clark Bao    schedule 18.09.2011
comment
@Clark Mh, как мне это сделать?   -  person Timo Ernst    schedule 19.09.2011
comment
@valmar проверь это. howtogeek.com/howto/linux/installing-tomcat-6 -on-ubuntu Tomcat полагается на JAVA_HOME. но в командной строке вы можете ввести java -version, чтобы узнать, являются ли они одной и той же версией, и проверить путь java bin, который использует команда.   -  person Clark Bao    schedule 20.09.2011
comment
@Clark Спасибо за ответ! Я установил Tomcat просто через sudo apt-get install tomcat6 (без ручной установки через wget). echo $JAVA_HOME мне ничего не возвращает! (Пустая строка) java -version дает мне следующее: java version "1.6.0_20" OpenJDK Runtime Environment (IcedTea6 1.9.9) (6b20-1.9.9-0ubuntu1~10.04.2) OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode) Имеет ли это для вас смысл?   -  person Timo Ernst    schedule 20.09.2011
comment
@valmar Можете ли вы попробовать экспортировать JAVA_HOME = ‹путь к 64-битной версии OpenJDK›, а затем перезапустить Tomcat и снова попробовать jps?   -  person Clark Bao    schedule 20.09.2011
comment
@ClarkBao Нет, это не помогло. jps -l по-прежнему возвращает только 2316 sun.tools.jps.Jps. echo $JAVA_HOME дает /usr/lib/jvm/java-6-openjdk   -  person Timo Ernst    schedule 21.09.2011
comment
@valmar Я не могу заглянуть в сценарий того, как Tomcat6 запускает Java-процесс. Возможно, вам придется отладить его, чтобы увидеть, какой jvm он действительно использует.   -  person Clark Bao    schedule 21.09.2011
comment
@ClarkBao Я проверил сценарий, и путь JDK кажется правильным, или я что-то упустил? dl.dropbox.com/u/17844821/zeug/tomcat_script.txt   -  person Timo Ernst    schedule 21.09.2011
comment
@valmar Не могу открыть ссылку. Но есть еще один способ получить дамп потока. Отправьте серверу сигнал SIGQUIT, чтобы принудительно выполнить дамп стека. Проверьте это. stackoverflow.com/questions/7135682/   -  person Clark Bao    schedule 22.09.2011
comment
@ClarkBao Дамп стека = дамп потока? Потому что ваша ссылка только описывает, как получить дамп стека. Вот новая ссылка на скрипт, кстати: zeug.grandia2.de/tomcat_script.txt   -  person Timo Ernst    schedule 22.09.2011
comment
@ClarkBao Я только что попробовал sudo kill -QUIT 5244, но ничего не вернул (просто пустая новая командная строка), и ничего не произошло (5244 - это PID tomcat, а -QUIT должен отправить SIGQUIT этому процессу).   -  person Timo Ernst    schedule 22.09.2011


Ответы (10)


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

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

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

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

person Timo Ernst    schedule 28.09.2011
comment
Размещение sudo -u <javaProcUsername> перед командой помогло мне. - person Jono; 25.06.2012
comment
Кстати, просто работая от имени того же пользователя, я устраняю эту ошибку - в моем случае пытаюсь подключиться к yourkit, но я считаю, что применим тот же принцип. Находиться в Sun JDK по сравнению с OpenJDK или указывать 64 или 32 бит, мне кажется, нет необходимости исправлять это. - person David W; 15.03.2014
comment
Выполнение команды jstack с тем же пользователем, под которым работал jvm, устранило проблему для меня. Спасибо, @DavidW! - person Andy Dufresne; 30.07.2014
comment
-J-d64 от root помог мне, я пробовал каждую комбинацию, правильный пользователь, sudo, root. С собственными фреймами (-m) и без них, но он начал работать, когда я поставил флаг -J-d64, мне также понадобилась -F, чтобы обойти процесс, который не отвечает. - person feldoh; 06.10.2015
comment
После переключения на пользователя tomcat флаг -F фактически приводил к сбою для меня. - person Amalgovinus; 23.03.2017

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

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

person Michael Pigg    schedule 14.09.2011
comment
Я не могу переключиться на пользователя tomcat6, потому что на самом деле это не настоящая учетная запись unix в системе. Итак, su tomcat6 не работает. Я только что пробовал sudo jps -l, но все равно дает только 6493 sun.tools.jps.Jps - person Timo Ernst; 15.09.2011
comment
Я также пробовал sudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt, но это дает мне только массу исключений на консоли: dl. dropbox.com/u/17844821/zeug/threaddump2.txt - сам дамп потока выглядит так: dl.dropbox.com/u/17844821/zeug/threaddumpexceptions2.txt. Мне кажется, что это неправильно. - person Timo Ernst; 15.09.2011
comment
@valmar: попробуйте это, чтобы стать tomcat6: переключиться на root: sudo su - из root вы можете переключиться на любого пользователя su tomcat6 - person Grey Panther; 22.09.2011
comment
@ Cd-MaN Нет эффекта. Если я это сделаю, это даст мне следующее (косая черта представляет собой символы новой строки, поскольку я не могу размещать символы новой строки здесь в комментариях): $ whoami // valmar // $ sudo su - // # whoami // root // # su tomcat6 // # whoami // root - person Timo Ernst; 22.09.2011
comment
@valmar: это, вероятно, означает, что у вас нет оболочки для данного пользователя (tomcat6) - или, точнее, у вас есть оболочка, установленная на что-то вроде / bin / false. Чтобы решить эту проблему, используйте su -p tomcat6 из-под учетной записи root (при этом сохраняется текущая оболочка). - person Grey Panther; 20.10.2011

@Valmar, я нахожу здесь ту же тему. Не удается получить дамп потока? Есть идеи, почему мое приложение блокируется?

Кажется, что обходной путь - sudo -u tomcat6 kill -3 <pid>.

person Clark Bao    schedule 24.09.2011
comment
Нет, это не помогло. Когда я это делаю, ничего не происходит. - person Timo Ernst; 24.09.2011
comment
если вы используете 64-битную версию, вам нужно использовать jstack -J-d64 -m pid, также попробуйте добавить sudu -u tomcat6. download.oracle.com/javase/6/docs/ technotes / tools / share / - person Clark Bao; 25.09.2011
comment
Хм, это дает мне только массу исключений на консоли: dl.dropbox. com / u / 17844821 / zeug / console64.txt - person Timo Ernst; 25.09.2011
comment
На вашем месте я попробую использовать другой jdk, а не openjdk. Может это из-за openjdk. - person Clark Bao; 26.09.2011
comment
Интересный. Я заменил openjdk-6-jre на sun-java6-jre, и теперь похоже, что jstack работает правильно. jps по-прежнему не показывает tomcat и его PID. @Clark Спасибо за вашу помощь! Если вы опубликуете свое предложение о замене JRE как новый отдельный ответ, я отмечу его как правильный ответ. - person Timo Ernst; 27.09.2011

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

sudo -u {пользователь процесса} jstack> дамп

person Joshua    schedule 21.07.2015

Это также сработало для меня:

sudo -u tomcat6 kill -3 pid

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

person Ted Bigham    schedule 05.04.2012

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

person Cameron Kerr    schedule 01.05.2014

У меня была такая же проблема, но ни одно из нижеприведенных решений не помогло мне:

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

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

person MK Aftab    schedule 08.11.2014

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

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

person John C    schedule 28.04.2017

Для тех, кто нашел этот ответ через шесть лет после того, как его спросили, и они используют CentOS 7, обратите внимание, что SELinux остановит jmap от записи дампов кучи, поскольку из коробки он откажется от записи в сокет, если только каталог имеет тип tomcat_tmp_t.

В моем случае я пишу свои дампы кучи под /usr/share/tomcat/.jmap. Этот каталог принадлежит моему пользователю среды выполнения.

Поэтому, чтобы позволить jmap писать в этот каталог:

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

Это позволяет нам затем работать как наш пользователь Tomcat:

jmap -dump:format=b,file=/usr/share/tomcat/.jmap/tomcat-`date +%s`.bin <pid>
person Ron    schedule 11.04.2018

Моя проблема заключалась в том, что я запустил процесс через терминал. Затем, чтобы протестировать свой jstack, я приостановил процесс на ctrl+z. Процесс не смог ответить. Чтобы решить эту проблему, я возобновил процесс с помощью fg и проверил его jstack с помощью другого терминала.

person Amir Fo    schedule 28.01.2020