programing

권한 오류로 인해 jstatd를 시작할 수 없습니다.

firstcheck 2021. 1. 17. 10:54
반응형

권한 오류로 인해 jstatd를 시작할 수 없습니다.


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 내용

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 버전 :

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 버전 :

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. tools.jar 파일이 있고 jstatd 명령을 실행하는 사용자에게 파일을 읽을 수있는 권한이 있는지 확인하십시오.

  2. jstatd.all.policytools.jar을 가리키는 URL 이 올 바르고 프로토콜 (이 경우 파일)을 선언 하는지 확인하십시오 . 예를 들어, java.home변수가 가리키는 위치에 따라 다음 ../과 같이 경로 에서 부분 을 제거해야 할 수 있습니다 .

    grant codebase "file:${java.home}/lib/tools.jar" {
       permission java.security.AllPermission;
    };
    
  3. Java 1.4부터 정책 파일은 BOM없이 UTF-8인코딩 되어야 합니다. EOL (CRLF 대 LF)은 실제로 중요하지 않습니다. 자세한 내용은 "변경 사항"섹션에서 Oracle의 "기본 정책 구현 및 정책 파일 구문"문서를 참조하십시오 (링크를 2 개 이상 게시 할 평판 포인트가 충분하지 않기 때문에 링크가 제공되지 않았습니다. 해당 문서를 찾을 수 있습니다).

  4. jstatd 명령을 실행할 때 정책 파일에 대한 절대 경로를 사용하십시오. 예 :

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

    편집 : -J매개 변수가 더 이상 Java 1.8에서 필요하거나 지원되지 않으므로이 명령은 다음과 같습니다.

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

    (이것을 지적 해 주신 @lisak에게 감사드립니다)

  5. 마지막으로 당신이 다른 문제를 발견 할 수있다이 점을 합격 한 후, (내가 그랬어) 이러한 게시물은 올바른 방향으로 절 지적 : 원격 JBoss의 인스턴스를 모니터링 할 수 VisualVM과 사용원격 VisualVM과를 사용하여 보스의 프로파일 링 . 기본적으로 당신은 보스에서 일부 자바 옵션을 1099가 이미 사용중인 경우 다른 포트를 사용하고 추가 -p 매개 변수를 사용해야 할 수 있습니다 run.conf통해 JAVA_OPTS(은 JBoss 인스턴스를 모니터링하는 가정). 모두 제공된 링크에 자세히 설명되어 있습니다.

편집 : -VisualVM을 사용 하여 동일한 내용을 가진 다른 페이지에 대한 원격 JBoss 인스턴스모니터링하는 데드 링크가 지적되었습니다 .


다음 스크립트를 실행하여 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} &

A one liner using process substitution (though bashism):

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

Wrapped:

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

As of jdk1.8.0_92, the java launcher option prefix -J is still required.

Note:

The original problem is more likely due to the tilde ~, in ~/jstatd.all.policy, isn't expanded hence not understood by java, meanwhile either absolute path or using ${HOME} instead should work.


I have the same problem and that what you should do:

  1. Make sure that javac is in your $PATH
  2. Specify full (absolute) path to the policy file when running jstatd
    jstatd -J-Djava.security.policy=/path/to/jstatd.all.policy

It helped for me.


Are you specifying your path wrong (i was)?

Try putting the policy in /tmp/jstatd.all.policy and then running:

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

Just an additional point about previous answers that cost me some minor time to figure out.
When I used relative path in the policy file ${java.home}/lib/tools.jar it actually pointed jstatd to JAVA_HOME/jre/ directory and since I had jdk installed I had to use ${java.home}/../lib/tools.jar instead to get to the right place.

EDIT I was running jstatd from within a docker container running ubuntu with jdk 8 (JAVA_HOME was set correctly).


I created new policy with following content:

grant codebase "file:/usr/java/latest/lib/tools.jar" { permission java.security.AllPermission; };

and then start jstatd with that policy with following command:

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


in addition to LightDye's answer, you can open required ports in your netfilter with this command :

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

@michael nesterenko 's answer is all right.

But if sometimes you can't connect the server even if you have get the Jstatd up, u may try to assign the '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 &

the hostname shoule be assigned as the public ip if you want to connect via public network.


Or you can use ejstatd instead of jstatd which automatically handles this problem: just run it using mvn exec:java inside ejstatd folder.

Disclaimer: I'm the author of this open source tool.

ReferenceURL : https://stackoverflow.com/questions/9939883/cannot-start-jstatd-due-to-permission-error

반응형