권한 오류로 인해 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)
이것은 나를 위해 일한 것입니다.
tools.jar 파일이 있고 jstatd 명령을 실행하는 사용자에게 파일을 읽을 수있는 권한이 있는지 확인하십시오.
jstatd.all.policy
tools.jar을 가리키는 URL 이 올 바르고 프로토콜 (이 경우 파일)을 선언 하는지 확인하십시오 . 예를 들어,java.home
변수가 가리키는 위치에 따라 다음../
과 같이 경로 에서 부분 을 제거해야 할 수 있습니다 .grant codebase "file:${java.home}/lib/tools.jar" { permission java.security.AllPermission; };
Java 1.4부터 정책 파일은 BOM없이 UTF-8 로 인코딩 되어야 합니다. EOL (CRLF 대 LF)은 실제로 중요하지 않습니다. 자세한 내용은 "변경 사항"섹션에서 Oracle의 "기본 정책 구현 및 정책 파일 구문"문서를 참조하십시오 (링크를 2 개 이상 게시 할 평판 포인트가 충분하지 않기 때문에 링크가 제공되지 않았습니다. 해당 문서를 찾을 수 있습니다).
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에게 감사드립니다)
마지막으로 당신이 다른 문제를 발견 할 수있다이 점을 합격 한 후, (내가 그랬어) 이러한 게시물은 올바른 방향으로 절 지적 : 원격 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:
- Make sure that
javac
is in your $PATH - 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
'programing' 카테고리의 다른 글
URL에서 이미지를 프로그래밍 방식으로 저장하려면 어떻게합니까? (0) | 2021.01.17 |
---|---|
VIM에서 CAPS LOCK 키를 매핑하는 방법은 무엇입니까? (0) | 2021.01.17 |
Ruby는 특정 디렉토리에서 쉘 명령을 실행합니다. (0) | 2021.01.17 |
Delphi ASIO VST 및 MiniHost의 미디 타이밍 문제 (0) | 2021.01.16 |
libgdx (roboVM)를 사용하여 iOS 라이브러리 또는 프레임 워크 만들기 (0) | 2021.01.16 |