【发布时间】:2015-04-16 15:00:00
【问题描述】:
我正在使用org.jruby.embed.ScriptingContainer API 在 JVM 进程内的 JRuby 上运行 Middleman(使用 Webrick)服务器。
如果我完全关闭并从 JVM 内部停止服务器,一切都会按预期工作。
但是,如果我向 JVM 进程发送 SIGTERM(例如,通过在命令行中按 ctrl+C),控制台会返回,但 JVM 进程不会终止——它会无限期地挂起,直到我向它发送 SIGKILL。
我尝试注册一个 JVM 关闭钩子来终止 ScriptingContainer 实例,但该钩子永远不会触发。我不知道为什么......也许 JRuby 正在以某种方式吞下 SIGTERM?
如何让 JVM 彻底关闭,即使它包含一个正在运行的 Webrick 服务器?
【问题讨论】:
-
您是否验证了问题出在 JRuby 上,也许是通过将
ScriptingContainer换成org.jruby.embed.EmbedRubyInstanceConfigAdapter的无操作实现并查看问题是否仍然存在? -
Control-C 不发送 SIGTERM,它发送 SIGINT
-
您使用的是什么操作系统?你可以在你按下 ctrl+c 之后提供一个 JVM 的线程转储吗? (运行
jstack <pid>)如何检查您的关闭挂钩是否触发? -
在WEBrick documentation 之后,我读到它是因为 WEBrick 能够安装 SIGINT 处理程序。所以中间人会做这部分。也许你的问题的根源在不同的地方。您是否尝试过使用
jconsole连接到会话以检查哪个线程仍然处于活动状态。 -
您是否创建了任何线程,或者 ScriptingContainer 是否创建了任何线程?