SBT 停止运行而不退出

Posted

技术标签:

【中文标题】SBT 停止运行而不退出【英文标题】:SBT stop run without exiting 【发布时间】:2011-07-05 11:30:54 【问题描述】:

如何在不退出的情况下终止 SBT 中的运行?

我正在尝试 CTRL+C,但它退出了 SBT。有没有办法在保持 SBT 打开的同时只退出正在运行的应用程序?

【问题讨论】:

Ctrl+D 不起作用。 我认为Ctrl + D 仅适用于 Play 框架。 【参考方案1】:

在默认配置中,你的运行发生在 sbt 运行的同一个 JVM 中,所以你不能轻易地单独杀死它们。

如果您在单独的分叉 JVM 中运行,如 Forking 所述,那么您可以终止该 JVM(通过您的操作系统提供的任何方式)而不影响 sbt 的 JVM:

fork in run := true

【讨论】:

我正在尝试这样做。具体来说,我已经实现了:***.com/questions/3868863/…,但是当我执行 CTRL+C 时 sbt 仍然退出。如何只杀死分叉的 JVM? 在命令行、任务管理器 (Windows)、强制退出或活动监视器 (Mac OS X) 等中使用 kill fork 后,要杀死除 sbt 之外的所有 java,运行:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk 'print $1'` 我喜欢这个想法,但它似乎没有帮助。我正在运行 sbt 0.13.1 并将这一行添加到我的 build.sbt 文件中.. 你需要用CTRL+D杀死run【参考方案2】:

当我可以控制从 sbt 运行的应用程序的主循环时,我发现以下内容很有用。

我告诉 sbt 在运行应用程序时 fork(在 build.sbt 中):

fork in run := true

我还告诉 sbt 将标准输入从 sbt shell 转发到应用程序(在 build.sbt 中):

connectInput in run := true

最后,在应用程序的主线程中,我在标准输入上等待文件结束,然后关闭 JVM:

while (System.in.read() != -1) 
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)

当然,您可以使用任何线程来读取标准输入和关闭,而不仅仅是主线程。

最后启动sbt,随意切换到你要运行的子项目,运行。

现在,当你想停止进程时,通过在 sbt shell 中输入 CTRL-D 来关闭它的标准输入。

【讨论】:

【参考方案3】:

从 sbt 版本 0.13.5 你可以添加到你的 build.sbt

cancelable in Global := true

它被定义为“启用 (true) 或禁用 (false) 使用 CTRL+C 中断任务执行的能力”。在Keys definition

如果您使用的是 Scala 2.12.7+,您还可以使用 CTRL+C 取消编译。参考https://github.com/scala/scala/pull/6479

报告了一些错误:

https://github.com/sbt/sbt/issues/1442 https://github.com/sbt/sbt/issues/1855

【讨论】:

【参考方案4】:

考虑使用sbt-revolver。我们在公司使用它,它真的很方便。 对于您所要求的可以通过以下方式完成:

reStart

reStop

无需配置 build.sbt 文件。

您可以通过添加以下内容来使用此插件:

addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")

到你的项目/plugins.sbt

【讨论】:

以上是关于SBT 停止运行而不退出的主要内容,如果未能解决你的问题,请参考以下文章

如何在Docker容器中运行Nginx而不停止?

如何设置 SBT 构建以在 Jenkins 测试失败时返回零退出代码?

退出活动而不关闭对话框

java如何从java内部捕获退出代码?

sbt-native-packager docker:publishLocal 返回:非零退出值:125

Cronjob 卡住而不退出