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.
Что такое параметры -Xms и -Xmx при запуске JVM?
Регистрация нескольких хранилищ ключей в JVM
Почему компилятор Java 11 использует invokevirtual для вызова приватных методов?
Что нельзя сделать в Dalvik VM (ВМ Android), но можно в Sun VM?
Как получить значение "os.name" для Windows 10 в Java?