首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >权限错误,无法启动jstatd

权限错误,无法启动jstatd
EN

Stack Overflow用户
提问于 2012-03-30 16:58:16
回答 11查看 65.3K关注 0票数 62

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

代码语言:javascript
复制
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

使用以下命令:

代码语言:javascript
复制
jstatd -J-Djava.security.policy=~/jstatd.all.policy

jstatd.all.policy内容

代码语言:javascript
复制
grant codebase "file:${java.home}/../lib/tools.jar" {

   permission java.security.AllPermission;

};

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

代码语言:javascript
复制
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版本:

代码语言:javascript
复制
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版本:

代码语言:javascript
复制
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)
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-02-18 13:41:08

这是对我有效的方法:

  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;};

  • 从Java1.4开始,策略文件需要使用UTF-8进行编码,而不能使用BOM。EOL (CRLF vs LF)应该无关紧要。有关更多信息,请参阅Oracle的“默认策略实现和策略文件语法”文档,在“更改”部分中(链接未提供,因为我没有足够的名誉点来发布超过2个链接,但我确信在运行document).

  • Use命令时,您将能够找到策略文件的绝对路径,例如

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

编辑:在Java1.8中可能不再需要或支持-J参数,因此此命令将改为:

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

(感谢@lisak指出这个out)

  • Finally,一旦你通过这一点,你可能会发现其他问题(我确实做到了),这些帖子给我指明了正确的方向:Using VisualVM to monitor a remote JBoss instanceRemote Profiling of JBoss using VisualVM。基本上,如果1099已经在使用中,您可能需要使用-p参数来使用不同的端口,并通过JAVA_OPTS在JBoss run.conf中添加一些java选项(假设您正在监控JBoss实例)。所有这些都在提供的链接中进行了更详细的解释。

编辑:-指向具有相同内容的另一个页面的死链接Using VisualVM to monitor a remote JBoss instance

票数 65
EN

Stack Overflow用户

发布于 2013-03-02 23:29:00

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

代码语言:javascript
复制
#!/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} &
票数 69
EN

Stack Overflow用户

发布于 2016-05-26 22:02:46

使用process substitution的one liner (尽管是bashism):

代码语言:javascript
复制
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启动器选项前缀-J仍然是必需的。

注意:

最初的问题更有可能是由于~/jstatd.all.policy中的代字号~没有扩展,因此java无法理解,同时绝对路径或使用${HOME}都应该可以工作。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9939883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档