jstack - известный файл не является безопасным - PullRequest
41 голосов
/ 01 февраля 2012

Я запускаю tomcat 5.5 на x86_64 CentOS 5.7 с использованием 32-битной Oracle Java 1.6.0.

Процесс JVM, используемый tomcat, имеет 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.
(...)

вопросы :

  1. что означает сообщение об ошибке «общеизвестный файл не защищен» означает?
  2. что такое"хорошо известный" файл?
  3. почему / когда команда jstack не работает без опции принудительного ввода?

Заранее спасибо.

Ответы [ 10 ]

32 голосов
/ 01 февраля 2012

Вероятно, это связано с тем, что файл в / tmp, используемый для связи с процессом, имеет права доступа, отличные от того, который получает jstack .Файл, о котором идет речь, /tmp/hsperfdata_$USER/$PID.

Не знаю, почему он работает с -F, так как страница руководства просто говорит «Принудительный сброс стека при jstack [-l] pid' не отвечает."

23 голосов
/ 17 апреля 2012

при использовании -F, jvm будет заморожено .

Если вы сможете найти file: /tmp/hsperfdata_$USER/$PID.Просто попробуйте переключиться на $USER, а затем exec jstack.Вы работаете с " root ", но этот процесс может не принадлежать root.

, если $USER не имеет оболочки входа (т.е. пользователей-демонов) и, следовательно, не может переключитьсядля этого пользователя вы можете обойти это, используя sudo -u $USER jstack $PID

6 голосов
/ 16 июня 2016

У меня была эта проблема, когда я пытался запустить jstack как root.

Как только я переключился на другого пользователя, он сразу заработал.

3 голосов
/ 14 мая 2013

Я просто хотел бы добавить, что вам может потребоваться указать каталог / tmp с помощью опции -J, так как не все приложения используют стандартное

jstack -J-Djava.io.tmpdir=PATH -l PID
1 голос
/ 10 марта 2016

Если вы не хотите беспокоиться о пользователе и можете работать от имени пользователя root, и все в порядке, чтобы убить процесс, вы можете использовать это последнее средство:

kill -s SIGQUIT $PID

Это запишет дамп потока в ваш консольный журнал, например, в случае Tomcat, который потребует подстановки для «Full Thread», который является началом дампа потока в logs / catalina.out, а затем получит 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 голос
/ 15 мая 2015

Я получаю ту же ошибку при запуске:

watch -n .5 "jstack 26259"

Действуя как sudo, он работает:

sudo watch -n .5 "jstack 26259"
0 голосов
/ 25 июля 2018

Помимо работы с тем же пользователем, убедитесь, что идентификатор группы пользователя, выполняющего jstack / jmap, также совпадает с процессом.

Взгляните на исходный код , который проверяет разрешение файла (строка 347). Мы можем видеть, что функция, получающая идентификатор группы, не является массивом, поэтому возможно, что у пользователя есть другие группы, которые запустили процесс.

Возможно, вам придется изменить основную группу у пользователя:

#usermod -g group -G user user

0 голосов
/ 02 апреля 2018

Чтобы успешно использовать jstack, вы должны запустить его с тем же пользователем, что и процесс.

0 голосов
/ 13 октября 2017

Наверное, самый простой способ:

см. Владельца процесса ps -ef | grep "имя процесса"

затем переключитесь на этого пользователя и выполните команду.

jcmd PID GC.run или любая другая утилита Java

Одна вещь, которую я заметил, что здесь никто не обсуждал; вам также нужно установить переменную JAVA_HOME. проверить это echo $ JAVA_HOME

0 голосов
/ 19 сентября 2017

Это тот лайнер, который я использую, чтобы убедиться, что я всегда использую правильные права пользователя:

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
...