由于 SIGTERM,我的自定义安全管理器当前阻止正常关闭。显示以下消息:
Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.SecurityException occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
我应该怎么做才能因 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)
[...]
java.security.Permissions@133c5982 (
(java.lang.RuntimePermission exitVM)
(java.io.FilePermission /path/to/current/working/directory/- read)
)
因此,您可以使用 SecurityManager
中的以下代码以更严格的方式启用 SIGTERM
信号处理:
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但要做到这一点并不明显,尝试修复方法仍然是最快的方法。
关于java - 在 SecurityManager 中启用 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9050805/