SBT interrompe la corsa senza uscire


120

Come si interrompe una corsa in SBT senza uscire?

Sto provando CTRL + C ma esce da SBT. Esiste un modo per uscire solo dall'applicazione in esecuzione mantenendo aperto SBT?


Ctrl+Dnon funziona.
botchniaque

Penso che Ctrl + Dfunzioni solo per il framework Play.
EnverOsmanov

Risposte:


44

Nella configurazione predefinita, le tue corse avvengono nella stessa JVM in cui è in esecuzione sbt, quindi non puoi ucciderle facilmente separatamente.

Se esegui la tua corsa in una JVM separata e biforcuta, come descritto in Forking , puoi uccidere quella JVM (con qualsiasi mezzo offerto dal tuo sistema operativo) senza influire sulla JVM di sbt:

fork in run := true

9
Sto provando a farlo. In particolare, ho implementato: stackoverflow.com/questions/3868863/… ma sbt esce ancora quando faccio CTRL + C. Come faccio a uccidere solo la JVM biforcuta?
dsg

2
con killdalla riga di comando, o nel Task Manager (Windows), o Force Quit o Activity Monitor (Mac OS X), ecc.
Seth Tisue

Dopo il fork, per uccidere tutto java tranne sbt, esegui:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg

1
Amo questa idea, ma non sembra aiutare. Sto eseguendo sbt 0.13.1 e aggiungo questa riga nel mio file build.sbt ..
doub1ejack

devi uccidere runcon CTRL + D
Timofey

82

Dalla versione sbt 0.13.5 puoi aggiungere al tuo build.sbt

cancelable in Global := true

È definito come "Abilita (true) o disabilita (false) la capacità di interrompere l'esecuzione dell'attività con CTRL + C." nella definizione delle chiavi

Se stai usando Scala 2.12.7+ puoi anche cancellare la compilazione con CTRL + C. Riferimento https://github.com/scala/scala/pull/6479

Sono stati segnalati alcuni bug:


5

Ho trovato utile quanto segue quando ho il controllo sul ciclo principale dell'applicazione in esecuzione da sbt.

Dico a sbt di eseguire il fork durante l'esecuzione dell'applicazione (in build.sbt):

fork in run := true

Dico anche a sbt di inoltrare stdin dalla shell sbt all'applicazione (in build.sbt):

connectInput in run := true

Infine, nel thread principale dell'applicazione, aspetto la fine del file su stdin e quindi chiudo la JVM:

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

Naturalmente, puoi usare qualsiasi thread per leggere stdin e shutdown, non solo il thread principale.

Infine, avvia sbt, opzionalmente passa al sottoprogetto che vuoi eseguire, esegui.

Ora, quando vuoi fermare il processo, chiudi il suo stdin digitando CTRL-D nella shell sbt.


1

Considera l' idea di usare sbt-revolver . Lo usiamo nella nostra azienda ed è davvero utile. Per quello che stai chiedendo si può fare con:

reStart

reStop

Senza bisogno di configurare il file build.sbt.

Puoi usare questo plugin aggiungendo:

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

Al tuo progetto / plugins.sbt

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.