0

jstack: известный файл не защищен

24

Я работаю с Tomcat 5.5 на x86_64 CentOS 5.7, используя 32-разрядную версию Oracle Java 1.6.0.

Процесс JVM, используемый Tomcat, имеет PID 6421. Tomcat функционирует нормально.

Когда я запускаю команду jstack, она завершается с ошибкой:

[root@mybox ~]# jstack 6421
6421: well-known file is not secure

Чтобы получить какое-то разумное вывод, мне нужно использовать опцию force:

[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. Что означает сообщение об ошибке "well-known file is not secure"?
  2. Какой файл считается "well-known"?
  3. Почему/когда команда jstack не работает без опции force?

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

5 ответ(ов)

0

Вам нужно выполнять команду jstack от имени пользователя, который владеет процессом Java.

Например, если ваше Java-приложение принадлежит пользователю с именем java-user, команда будет выглядеть следующим образом:

sudo -u java-user jstack -l <pid>

Замените <pid> на идентификатор процесса вашего Java-приложения.

0

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

0

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

jstack -J-Djava.io.tmpdir=PATH -l PID

Где PATH — это путь к вашему временной директории, а PID — идентификатор процесса.

0

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

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

0

Когда используется параметр -F, JVM будет заморожена.

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

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь