3
由於SIGTERM,我的自定義安全管理器當前會阻止正常關閉。將顯示如下消息:在SecurityManager中啓用SIGTERM
爪哇熱點(TM)64位服務器VM警告:異常java.lang.SecurityException異常發生調度信號SIGTERM到handler-虛擬機可能需要強制結束
我應該怎麼做才能使由於SIGTERMS而關閉,但僅此而已?
由於SIGTERM,我的自定義安全管理器當前會阻止正常關閉。將顯示如下消息:在SecurityManager中啓用SIGTERM
爪哇熱點(TM)64位服務器VM警告:異常java.lang.SecurityException異常發生調度信號SIGTERM到handler-虛擬機可能需要強制結束
我應該怎麼做才能使由於SIGTERMS而關閉,但僅此而已?
如果您省略呼叫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方法仍然是最快的方法。
你知道你的SecurityManager引起異常的檢查方法嗎?據我所知,相關的一個是:checkPermission(java.lang.RuntimePermission shutdownHooks) – 2012-06-01 05:40:22
對不起,2其他:checkAccess()與「系統」線程組,和checkAccess()與SIGTERM處理程序線程內的「系統「線程組。你的SecurityManager是否阻止了這些訪問? – 2012-06-01 06:00:46
目前已禁用所有功能。 – 2012-06-01 13:49:25