SBT остановить работу без выхода

120

Как завершить пробежку в SBT, не выходя из нее?

Я пытаюсь CTRL + C, но он выходит из SBT. Есть ли способ выйти только из работающего приложения, оставив SBT открытым?

DSG
источник
Ctrl+Dне работает.
botchniaque
Думаю Ctrl + Dработает только для фреймворка Play.
EnverOsmanov

Ответы:

44

В конфигурации по умолчанию ваши запуски происходят в той же JVM, что и sbt, поэтому вы не можете легко убить их по отдельности.

Если вы выполняете свой запуск в отдельной разветвленной JVM, как описано в Forking , вы можете убить эту JVM (любыми способами, предлагаемыми вашей операционной системой), не затрагивая JVM sbt:

fork in run := true
Сет Тисью
источник
9
Я пытаюсь это сделать. В частности, я реализовал: stackoverflow.com/questions/3868863/… но sbt все равно выходит, когда я нажимаю CTRL + C. Как убить только разветвленную JVM?
dsg
2
с помощью killиз командной строки, или в диспетчере задач (Windows), или
принудительном выходе,
После разветвления, чтобы убить все java, кроме sbt, выполните:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg
1
Мне нравится эта идея, но, похоже, она не помогает. Я запускаю sbt 0.13.1 и добавляю эту строку в свой файл build.sbt ..
duplic1ejack
нужно убить с runпомощью CTRL + D
Тимофей
82

Из sbt версии 0.13.5 вы можете добавить в свой build.sbt

cancelable in Global := true

Он определяется как «Разрешает (истина) или отключает (ложь) возможность прерывания выполнения задачи с помощью CTRL + C». в определении ключей

Если вы используете Scala 2.12.7+, вы также можете отменить компиляцию с помощью CTRL + C. Ссылка https://github.com/scala/scala/pull/6479

Сообщается о некоторых ошибках:

Йонас Ансо
источник
5

Я нашел следующее полезным, когда у меня есть контроль над основным циклом приложения, запускаемого из sbt.

Я говорю sbt разветвляться при запуске приложения (в build.sbt):

fork in run := true

Я также говорю sbt перенаправить stdin из оболочки sbt в приложение (в 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)

Конечно, вы можете использовать любой поток для чтения stdin и завершения работы, а не только основной поток.

Наконец, запустите sbt, при необходимости переключитесь на подпроект, который вы хотите запустить, запустите.

Теперь, когда вы хотите остановить процесс, закройте его стандартный ввод, набрав CTRL-D в оболочке sbt.

кило
источник
1

Подумайте об использовании SBT-Revolver . Мы используем его в нашей компании, и это действительно удобно. То, что вы просите, можно сделать с помощью:

reStart

reStop

Без необходимости настраивать файл build.sbt.

Вы можете использовать этот плагин, добавив:

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

К вашему проекту / plugins.sbt

mtsokol
источник