jstack: известный файл не защищен
Я работаю с 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.
(...)
У меня есть несколько вопросов:
- Что означает сообщение об ошибке "well-known file is not secure"?
- Какой файл считается "well-known"?
- Почему/когда команда
jstack
не работает без опции force?
Заранее спасибо!
5 ответ(ов)
Вам нужно выполнять команду jstack
от имени пользователя, который владеет процессом Java.
Например, если ваше Java-приложение принадлежит пользователю с именем java-user
, команда будет выглядеть следующим образом:
sudo -u java-user jstack -l <pid>
Замените <pid>
на идентификатор процесса вашего Java-приложения.
У меня была аналогичная проблема, когда я пытался запустить jstack
от имени пользователя root
. Как только я переключился на другого пользователя, команда сработала сразу же.
Вы можете уточнить, что вам может потребоваться указать каталог /tmp с помощью опции -J, так как не все приложения используют каталог по умолчанию. Попробуйте выполнить следующую команду:
jstack -J-Djava.io.tmpdir=PATH -l PID
Где PATH
— это путь к вашему временной директории, а PID
— идентификатор процесса.
Это, вероятно, связано с тем, что файл в /tmp, используемый для взаимодействия с процессом, имеет другие права доступа, чем те, которые использует jstack
. Речь идет о файле /tmp/hsperfdata_$USER/$PID.
Не могу точно сказать, почему команда работает с флагом -F, так как в руководстве написано лишь, что этот флаг "Принудительно создает дамп стека, когда 'jstack [-l] pid' не отвечает."
Когда используется параметр -F
, JVM будет заморожена.
Если вам удастся найти файл: /tmp/hsperfdata_$USER/$PID
, просто попытайтесь переключиться на $USER
, а затем выполните exec jstack
. Вы работаете от имени "root", но этот процесс может не принадлежать пользователю root.
Если у $USER
нет входной оболочки (например, для демонов) и вы не можете переключиться на этого пользователя, вы можете обойти это ограничение, используя команду sudo -u $USER jstack $PID
.
Как определить, запущен ли код в 64-разрядной или 32-разрядной JVM (изнутри программы)?
Регистрация нескольких хранилищ ключей в JVM
Почему компилятор Java 11 использует invokevirtual для вызова приватных методов?
Безопасно ли использовать -XX:MaxRAMFraction=1 в продакшене в контейнеризованной среде?
Что нельзя сделать в Dalvik VM (ВМ Android), но можно в Sun VM?