由于权限错误,无法启动 jstatd

2022-08-31 15:45:50

我尝试在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

使用以下命令:

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

jstatd.all.policy contents

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 在具有相同命令和策略文件的窗口上成功运行。

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)

Windows java version:

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)

答案 1

刚刚找到以下脚本来运行。我设法用这个脚本运行 https://gist.github.com/nicerobot/1375032jstatdjstatd

#!/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} &

答案 2

这对我有用:

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

  2. 确保 中指向工具.jar的 URL 正确无误,并声明了协议(在本例中为文件)。例如,根据变量指向的位置,您可能需要像这样删除路径中的部分(我必须这样做):jstatd.all.policyjava.home../

    grant codebase "file:${java.home}/lib/tools.jar" {
       permission java.security.AllPermission;
    };
    
  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
    

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

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

    (感谢@lisak指出这一点)

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

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


推荐