2012-01-29 45 views
3

由於SIGTERM,我的自定義安全管理器當前會阻止正常關閉。將顯示如下消息:在SecurityManager中啓用SIGTERM

爪哇熱點(TM)64位服務器VM警告:異常java.lang.SecurityException異常發生調度信號SIGTERM到handler-虛擬機可能需要強制結束

我應該怎麼做才能使由於SIGTERMS而關閉,但僅此而已?

+0

你知道你的SecurityManager引起異常的檢查方法嗎?據我所知,相關的一個是:checkPermission(java.lang.RuntimePermission shutdownHooks) – 2012-06-01 05:40:22

+0

對不起,2其他:checkAccess()與「系統」線程組,和checkAccess()與SIGTERM處理程序線程內的「系統「線程組。你的SecurityManager是否阻止了這些訪問? – 2012-06-01 06:00:46

+0

目前已禁用所有功能。 – 2012-06-01 13:49:25

回答

1

如果您省略呼叫super.checkAccess,那麼您的實施可能會禁用來自-Djava.security.debug=all的全部調試信息。如果你第一次寫在你的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呼叫,以允許和權限的信息添加到您的策略文件。我總結一下:

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) 
) 

結果,你能SIGTERM信號用下面的代碼處理更嚴格的方式你SecurityManager

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

以及這些權限在java.security.policy文件批准:

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

完整的信息是可用的here但它是真的不明顯做到這一點,嘗試一個nd-fix方法仍然是最快的方法。