由于权限错误无法启动jstatd

mic*_*nko 53 java jvm

我尝试在linux机器上运行jstatd jvm监控工具

jboss@hostAddr:/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
Run Code Online (Sandbox Code Playgroud)

使用以下命令:

jstatd -J-Djava.security.policy=~/jstatd.all.policy
Run Code Online (Sandbox Code Playgroud)

jstatd.all.policy内容

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

   permission java.security.AllPermission;

};
Run Code Online (Sandbox Code Playgroud)

不幸的是我得到以下输出:

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)
Run Code Online (Sandbox Code Playgroud)

出于某种原因,jstatd在具有相同命令和策略文件的Windows上成功运行.

Linux java版:

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)
Run Code Online (Sandbox Code Playgroud)

Windows java版本:

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)
Run Code Online (Sandbox Code Playgroud)

mic*_*nko 65

刚刚找到以下脚本运行jstatd.我设法jstatd使用此脚本 运行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} &
Run Code Online (Sandbox Code Playgroud)


Lig*_*Dye 57

这对我有用:

  1. 确保tools.jar文件存在,并且运行jstatd命令的用户具有读取它的权限.

  2. 确保jstatd.all.policy指向tools.jar 的URL 正确并声明协议(在本例中为文件).例如,根据java.home变量指向的位置,您可能需要删除../路径中的部分,就像这样(我不得不):

    grant codebase "file:${java.home}/lib/tools.jar" {
       permission java.security.AllPermission;
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从Java 1.4开始,策略文件需要以UTF-8编码而不需要BOM.EOL(CRLF vs LF)应该不重要.请参阅Oracle的"默认策略实施和策略文件语法"文档,在"更改"部分下获取更多信息(链接未提供,因为我没有足够的信誉点来发布超过2个链接,但我确定你'能够找到该文件).

  4. 运行jstatd命令时,请使用策略文件的绝对路径,例如

    jstatd -p 12345 -J-Djava.security.policy=/absolute-path-to/jstatd.all.policy
    
    Run Code Online (Sandbox Code Playgroud)

    编辑:-JJava 1.8中可能不再需要或支持该参数,因此该命令将改为:

    jstatd -p 12345 -Djava.security.policy=/absolute-path-to/jstatd.all.policy
    
    Run Code Online (Sandbox Code Playgroud)

    (感谢@lisak指出这一点)

  5. 最后,一旦你通过这一点,你可能会发现其他问题(我做了),这些帖子指出了我正确的方向:使用VisualVM监视远程JBoss实例使用VisualVM的JBoss远程概要分析.基本上,你可能需要使用-p参数来使用不同的端口,如果1099已在使用,并添加了JBoss一些Java选项run.conf通过JAVA_OPTS(假设您正在监控的JBoss实例).所有链接中都有更详细的解释.

编辑: - 指向死链接使用VisualVM将远程JBoss实例监视到具有相同内容的另一个页面.

  • 在我的情况下,一些$ {java.home}或$ {JAVA_HOME}如何工作.我必须指定tools.jar的完整绝对路径. (8认同)
  • 我不得不在策略文件和shell命令中使用绝对路径. (2认同)

rye*_*nus 17

使用过程替换的一个班轮(虽然是bashism):

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

包裹:

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

从那时起jdk1.8.0_92,-J仍然需要java启动器选项前缀.

注意:

原始问题更可能是由于波浪线~,因为~/jstatd.all.policy没有扩展因此不被java理解,同时绝对路径或使用${HOME}相反应该起作用.