SBT停止运行而不退出


120

您如何在不退出的情况下终止SBT中的跑步?

我正在尝试按CTRL + C,但是它退出了SBT。有没有办法仅在保持SBT打开的情况下退出运行的应用程序?


Ctrl+D不起作用。
botchniaque

我认为Ctrl + D仅适用于Play框架。
EnverOsmanov '16

Answers:


44

在默认配置中,您的运行在与sbt运行的同一JVM中进行,因此您无法轻松地将它们分别杀死。

如果按照Forking所述在单独的,分叉的JVM中运行,则可以杀死JVM(通过操作系统提供的任何方式)而不会影响sbt的JVM:

fork in run := true

9
我正在尝试这样做。具体来说,我已经实现了:stackoverflow.com/questions/3868863/…但是当我执行CTRL + C时sbt仍然退出。如何仅杀死分叉的JVM?
dsg

2
使用kill命令行,或在任务管理器(Windows),或强制退出或活动监视器(Mac OS X的),等等
赛斯Tisue

分叉后,要杀死除sbt之外的所有Java,请运行:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg

1
我喜欢这个主意,但似乎无济于事。我正在运行sbt 0.13.1并将此行添加到我的build.sbt文件中
。– doub1ejack

您需要run使用CTRL + D 杀死
Timofey,2015年


5

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

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

fork in run := true

我还告诉sbt将stdin从sbt外壳转发到应用程序(在build.sbt中):

connectInput in run := true

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

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

当然,您可以使用任何线程来读取stdin和shutdown,而不仅仅是主线程。

最后,启动sbt,有选择地切换到要运行的子项目。

现在,当您想停止该进程时,通过在sbt shell中键入CTRL-D来关闭其标准输入。


1

考虑使用sbt-revolver。我们在公司中使用它,非常方便。对于您的要求,可以使用以下方法完成:

reStart

reStop

无需配置build.sbt文件。

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

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

到您的项目/plugins.sbt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.