首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SecurityManager中启用SIGTERM

在SecurityManager中启用SIGTERM
EN

Stack Overflow用户
提问于 2012-01-29 04:00:06
回答 1查看 262关注 0票数 3

由于SIGTERM,我的自定义安全管理器目前阻止优雅的关闭。将显示以下消息:

Java (TM)64位服务器VM警告:异常HotSpot java.lang.SecurityException发生向处理程序发送信号SIGTERM可能需要强制终止VM

我应该怎么做才能使关闭由于SIGTERMS,但没有更多?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-01 20:52:28

如果省略调用-Djava.security.debug=all,您的实现可能已经禁用了super.checkAccess中的全部调试信息。如果您首先在SecurityManager实现中编写

代码语言:javascript
复制
  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调用和向策略文件添加权限的信息。我总结如下:

代码语言:javascript
复制
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)
)

因此,您可以使用SIGTERM中的以下代码对SecurityManager信号进行更严格的处理

代码语言:javascript
复制
  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文件中授予以下权限:

代码语言:javascript
复制
grant {
  permission java.lang.RuntimePermission "modifyThreadGroup";
  permission java.lang.RuntimePermission "modifyThread";
  permission java.lang.RuntimePermission "exitVM";
};

完整的信息是可用的这里,但是做好这件事并不明显,尝试修复方法仍然是最快的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9050805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档