2012-01-29 2 views
3

내 사용자 지정 보안 관리자는 현재 SIGTERM 때문에 정상적인 종료를 차단합니다.SecurityManager에서 SIGTERM 사용

자바 핫스팟 (TM) 64 비트 서버 VM 경고 :이 java.lang.SecurityException가 VM을 핸들러 -하는 신호 SIGTERM을 파견 발생한 예외가해야 할 수도 있습니다 강제

을 종료 후속 메시지가 표시됩니다

SIGTERMS로 인해 종료가 가능하도록하려면 어떻게해야합니까?

+0

SecurityManager가 해당 예외의 원인이되는 검사 방법을 알고 계십니까? CheckPermission (java.lang.RuntimePermission shutdownHooks) –

+0

죄송합니다. 2 개의 다른 사용자 : checkAccess()와 "system"스레드 그룹을 사용하고 checkAccess()를 " 시스템 "스레드 그룹. SecurityManager가 이러한 액세스를 방지합니까? –

+0

현재 모든 것이 비활성화되어 있습니다. –

답변

1

-Djava.security.debug=all의 코드를 생략하면 전체 디버깅 정보가 비활성화되어 아마 super.checkAccess으로 호출됩니다. 당신이 당신의 SecurityManager 구현

public void checkAccess(ThreadGroup g) { 
     System.out.println("Access for " + g); 
     super.checkAccess(g); 
    } 
    public void checkAccess(Thread t) { 
     System.out.println("Access for " + t); 
     super.checkAccess(t); 
    } 

먼저 작성하고 -Djava.security.debug=all으로 실행하는 경우, 당신은 당신의 정책 파일에 추가 checkAccess 수 있도록 전화 및 권한에 대한 정보를 얻을 수 있습니다. I 요약 : 당신의 java.security.policy 파일에 부여

public void checkAccess(ThreadGroup g) { 
     System.out.println("Access for " + g); 
     if ("system".equals(g.getName())) { 
     // will checkPermission java.lang.RuntimePermission "modifyThreadGroup" 
     super.checkAccess(g); 
     } else { 
     throw new SecurityException("Access denied to " + g); 
     } 
    } 

    public void checkAccess(Thread t) { 
     System.out.println("Access for " + t); 
     if ("SIGTERM handler".equals(t.getName())) { 
     // will checkPermission java.lang.RuntimePermission "modifyThread" 
     super.checkAccess(t); 
     } else { 
     throw new SecurityException("Access denied to " + t); 
     } 
    } 

또한 이러한 권한 :

결과
Access for java.lang.ThreadGroup[name=system,maxpri=10] 
Permission (java.lang.RuntimePermission modifyThreadGroup) 
[...] 
Access for Thread[SIGTERM handler,9,system] 
Permission (java.lang.RuntimePermission modifyThread) 
[...] 
[email protected] (
(java.lang.RuntimePermission exitVM) 
(java.io.FilePermission /path/to/current/working/directory/- read) 
) 

, 당신이 당신의 SecurityManager에 다음 코드로 엄격한 방식으로 처리 SIGTERM 신호를 가능하게

grant { 
    permission java.lang.RuntimePermission "modifyThreadGroup"; 
    permission java.lang.RuntimePermission "modifyThread"; 
    permission java.lang.RuntimePermission "exitVM"; 
}; 

자세한 내용은 here을 참조하십시오.하지만 실제로 시도하는 것은 분명하지 않습니다. try-a nd-fix 방법은 여전히 ​​가장 빠른 방법입니다.