How to exit a sbt task?
我运行一个sbt任务。 完成后的正常情况下,它应该在终端中停止。 但是终端不等待下一个输入的意思:我的任务一直在运行。 我假设在任务启动它们之后没有退出一些被调用的线程。
如何退出clean并杀死sbt任务启动的所有进程?
我可以调试哪个服务没有停止,但是要花很长时间才能弄清楚。
更多细节
在build.sbt中
1 2
| lazy val refreshTranslations = taskKey [Unit ]("blabla")
fullRunTask (refreshTranslations, Compile, "tasks.TranslationTask") |
在任务中
1 2 3 4 5 6 7 8
| object TranslationTask {
def main (args : Array [String ]): Unit = {
// background stuff with ActorSystem() , AhcWSClient()
Await. result(service. get, 20. seconds)
...
}
} |
-
您是否在终端中尝试过crtl + d
-
我知道如何使用cmd + C在终端中退出。 我在SBT中特别询问。
-
您的任务正在运行外部定义的函数? 为什么不定义它并将其作为常规任务运行?
-
这与此有关:stackoverflow.com/a/24600377/1553233
-
@marios,好像。 但是到了2017年,SBT似乎已经过时了
-
如果您有可复制复制(有史以来最好的词?)的示例,我可以将其复制并尝试一下。
-
我已经将示例代码放在我的帖子中。 但是,是的,我正在使用ActorSystem()运行客户端。 我不知道什么没有关闭。 因此,我想杀死整个SBT过程。
-
akka ActorSystem使用非守护线程。 您需要在JVM退出之前在ActorSystem上调用终止。 在sbt中,您可能希望将其放在关闭钩子中。
我找到了一种在SBT任务完成后退出ActorSystem的方法。
在build.sbt中,在其他线程中启动任务。
1 2 3
| lazy val refreshTranslationsFallback = taskKey [Unit ]("Refresh the translations file fallback")
fullRunTask (refreshTranslationsFallback, Compile, "tasks.TranslationTask")
fork in refreshTranslationsFallback := true |
在任务中
1 2 3 4 5 6 7 8
| object TranslationTask {
def main (args : Array [String ]): Unit = {
// background stuff with ActorSystem() , AhcWSClient()
...
scala. sys. exit() // important
}
} |
特别感谢SBT在不退出的情况下停止运行