O SBT para de executar sem sair


120

Como você encerra uma execução no SBT sem sair?

Estou tentando CTRL + C, mas ele sai do SBT. Existe uma maneira de sair apenas do aplicativo em execução enquanto mantém o SBT aberto?


Ctrl+Dnão funciona.
Botchniaque

Eu acho que Ctrl + Dfunciona apenas para o framework Play.
EnverOsmanov

Respostas:


44

Na configuração padrão, suas execuções acontecem na mesma JVM que o sbt está executando, portanto, você não pode matá-las facilmente separadamente.

Se você executar sua execução em uma JVM bifurcada separada, conforme descrito em Forking , poderá matá-la (por qualquer meio que seu sistema operacional oferecer) sem afetar a JVM da sbt:

fork in run := true

9
Estou tentando fazer isso. Especificamente, eu implementei: stackoverflow.com/questions/3868863/…, mas o sbt ainda sai quando eu faço CTRL + C. Como eu mato apenas a JVM bifurcada?
dsg 20/03

2
com killa partir da linha de comando, ou no Gerenciador de Tarefas (Windows), ou Forçar Encerrar ou Activity Monitor (Mac OS X), etc.
Seth tisue

Depois de bifurcar, para matar tudo o que é java, exceto o sbt, execute:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg

1
Eu amo essa idéia, mas não parece ajudar. Estou correndo sbt 0.13.1 e adicionando esta linha no meu arquivo build.sbt ..
doub1ejack

você precisa matar o runcom CTRL + D
Timofey

82

Na versão 0.13.5 do sbt, você pode adicionar ao seu build.sbt

cancelable in Global := true

É definido como "Habilita (verdadeiro) ou desabilita (falso) a capacidade de interromper a execução da tarefa com CTRL + C". no definição de chaves

Se você estiver usando o Scala 2.12.7+, também poderá cancelar a compilação com CTRL + C. Referência https://github.com/scala/scala/pull/6479

Existem alguns erros relatados:


5

Eu achei o seguinte útil quando tenho controle sobre o loop principal do aplicativo que está sendo executado a partir do sbt.

Eu digo ao sbt para bifurcar ao executar o aplicativo (no build.sbt):

fork in run := true

Eu também digo ao sbt para encaminhar o stdin do shell sbt para o aplicativo (no build.sbt):

connectInput in run := true

Finalmente, no encadeamento principal do aplicativo, espero o final do arquivo no stdin e, em seguida, encerro a JVM:

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

Obviamente, você pode usar qualquer thread para ler stdin e shutdown, não apenas o thread principal.

Por fim, inicie o sbt, alternativamente, alterne para o subprojeto que deseja executar, execute.

Agora, quando você quiser interromper o processo, feche seu stdin digitando CTRL-D no shell sbt.


1

Considere usar o sbt-revolver . Nós o usamos em nossa empresa e é realmente útil. O que você está pedindo pode ser feito com:

reStart

reStop

Sem a necessidade de configurar o arquivo build.sbt.

Você pode usar este plugin adicionando:

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

Para o seu projeto / plugins.sbt

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.