Подтвердить что ты не робот

Не может запустить jstatd из-за ошибки разрешения

Я пытаюсь запустить утилиту jstatd jvm для мониторинга на машине linux

[email protected]:/usr/java/jdk1.6.0_18/bin> uname -a
Linux hostAddr 2.6.16.60-0.34-smp #1 SMP Fri Jan 16 14:59:01 UTC 2009 x86_64 x86_64 x86_64 GNU/Linux

со следующей командой:

jstatd -J-Djava.security.policy=~/jstatd.all.policy

Содержимое jstatd.all.policy

grant codebase "file:${java.home}/../lib/tools.jar" {

   permission java.security.AllPermission;

};

К сожалению, я получаю следующий вывод:

Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.System.setProperty(System.java:725)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

По какой-то причине jstatd успешно запускается в Windows с тем же командным и политическим файлом.

Linux java version:

java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)

Версия java для Windows:

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
4b9b3361

Ответ 1

Это то, что сработало для меня:

  • Убедитесь, что файл tools.jar существует, и пользователь, выполняющий команду jstatd, имеет разрешения на его чтение.

  • Убедитесь, что URL-адрес в jstatd.all.policy, который указывает на tools.jar, является правильным и объявляет протокол (в этом случае файл). Например, в зависимости от того, где указана переменная java.home, вам может потребоваться удалить часть ../ в пути, как это было (мне пришлось):

    grant codebase "file:${java.home}/lib/tools.jar" {
       permission java.security.AllPermission;
    };
    
  • Начиная с Java 1.4, файл политики должен быть закодирован в UTF-8 без спецификации. EOL (CRLF против LF) не имеет большого значения. Для получения дополнительной информации см. Документ "Синтаксис политики реализации политики и политический файл" от Oracle, в разделе "Изменения" (ссылка не указана, потому что у меня недостаточно очков репутации для размещения более двух ссылок, но я уверен, вы сможете найти этот документ).

  • Используйте абсолютный путь к файлу политики при запуске команды jstatd, например

    jstatd -p 12345 -J-Djava.security.policy=/absolute-path-to/jstatd.all.policy
    

    EDIT: параметр -J может больше не требоваться или поддерживаться в Java 1.8, поэтому вместо этой команды:

    jstatd -p 12345 -Djava.security.policy=/absolute-path-to/jstatd.all.policy
    

    (спасибо @lisak за указание этого)

  • Наконец, как только вы пройдете этот момент, вы можете найти другие проблемы (я сделал), и эти сообщения указали мне в правильном направлении: Использование VisualVM для контролировать удаленный экземпляр JBoss и Удаленное профилирование JBoss с использованием VisualVM. В принципе, вам может понадобиться использовать параметр -p для использования другого порта, если 1099 уже используется, и добавить java-параметры в JBoss run.conf через JAVA_OPTS (при условии, что вы контролируете экземпляр JBoss). Все объяснено более подробно в представленных ссылках.

EDIT: - Указанная мертвая ссылка Использование VisualVM для мониторинга удаленного экземпляра JBoss на другой странице с тем же контентом.

Ответ 2

Только что найдено script для запуска jstatd. Мне удалось запустить jstatd с помощью этого script https://gist.github.com/nicerobot/1375032

#!/bin/sh
policy=${HOME}/.jstatd.all.policy
[ -r ${policy} ] || cat >${policy} <<'POLICY'
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
POLICY

jstatd -J-Djava.security.policy=${policy} &

Ответ 3

Один вкладыш с использованием замены процесса (хотя и багизм):

jstatd -p 1099 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')

обернутый:

jstatd -p 1099 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')

Как и для jdk1.8.0_92, требуется префикс опции java launcher -J.

Примечание:

Исходная проблема, скорее всего, из-за тильды ~, в ~/jstatd.all.policy, не расширяется, поэтому не понимается java, между тем должен работать либо абсолютный путь, либо использование ${HOME}.

Ответ 4

У меня такая же проблема и что вы должны делать:

  • Убедитесь, что javac находится в $PATH
  • Укажите полный (абсолютный) путь к файлу политики при запуске jstatd
    jstatd -J-Djava.security.policy=/path/to/jstatd.all.policy

Это помогло мне.

Ответ 5

Вы указываете свой путь неправильно (я был)?

Попробуйте ввести политику в /tmp/jstatd.all.policy и затем запустить:

jstatd -J-Djava.security.policy=/tmp/jstatd.all.policy

Ответ 6

Еще один вопрос о предыдущих ответах, которые стоили мне немного времени для выяснения.
Когда я использовал относительный путь в файле политики ${java.home}/lib/tools.jar, он на самом деле указал jstatd на каталог JAVA_HOME/jre/, и, поскольку у меня был установлен jdk, мне пришлось использовать ${java.home}/../lib/tools.jar вместо этого, чтобы попасть в нужное место.

EDIT Я запускал jstatd из контейнера докеров, на котором запущен ubuntu с jdk 8 (JAVA_HOME был установлен правильно).

Ответ 7

в дополнение к ответу LightDye, вы можете открыть необходимые порты в своем сетевом файле с помощью этой команды:

for port in `netstat -nlp | grep jstatd | sed -r 's/^.*\:([0-9]{4,}).*$/\1/'`; do iptables -I INPUT 1 -p tcp --dport $port -j ACCEPT -m comment --comment jstatd; done

Ответ 8

@michael nesterenko ответ все в порядке.

Но если иногда вы не можете подключить сервер, даже если у вас есть Jstatd, вы можете попытаться присвоить 'rmi.server.hostname'

#!/bin/sh
policy=${HOME}/.jstatd.all.policy
[ -r ${policy} ] || cat >${policy} <<'POLICY'
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
POLICY

jstatd -J-Djava.security.policy=${policy} -J-Djava.rmi.server.hostname=192.168.x.x &

имя хоста должно быть назначено как общедоступный ip, если вы хотите подключиться через общедоступную сеть.

Ответ 9

Или вы можете использовать ejstatd вместо jstatd, который автоматически обрабатывает эту проблему: просто запустите ее, используя mvn exec:java внутри ejstatd папку.

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

Ответ 10

Я создал новую политику со следующим контентом:

grant codebase "file:/usr/java/latest/lib/tools.jar" {разрешение java.security.AllPermission; };

а затем запустите jstatd с этой политикой со следующей командой:

jstatd -J-Djava.security.policy =/usr/java/jstatd.all.policy &