SBT berhenti berjalan tanpa keluar

120

Bagaimana Anda menghentikan proses di SBT tanpa keluar?

Saya mencoba CTRL + C tetapi keluar dari SBT. Apakah ada cara untuk hanya keluar dari aplikasi yang sedang berjalan sambil tetap membuka SBT?

dsg
sumber
Ctrl+Dtidak bekerja.
botchniaque
Saya pikir Ctrl + Dhanya berfungsi untuk kerangka Play.
EnverOsmanov

Jawaban:

44

Dalam konfigurasi default, proses Anda terjadi di JVM yang sama dengan sbt yang dijalankan, jadi Anda tidak dapat dengan mudah mematikannya secara terpisah.

Jika Anda menjalankan dalam JVM terpisah dan bercabang, seperti yang dijelaskan di Forking , maka Anda dapat menghentikan JVM itu (dengan cara apa pun yang ditawarkan sistem operasi Anda) tanpa memengaruhi JVM sbt:

fork in run := true
Seth Tisue
sumber
9
Saya mencoba melakukan ini. Secara khusus, saya telah menerapkan: stackoverflow.com/questions/3868863/… tetapi sbt masih keluar ketika saya melakukan CTRL + C. Bagaimana cara membunuh JVM bercabang saja?
dsg
2
dengan killdari baris perintah, atau di Task Manager (Windows), atau Force Quit atau Activity Monitor (Mac OS X), dll.
Seth Tisue
Setelah bercabang, untuk mematikan semua java kecuali sbt, jalankan:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg
1
Saya suka ide ini, tetapi sepertinya tidak membantu. Saya menjalankan sbt 0.13.1 dan menambahkan baris ini ke dalam file build.sbt saya ..
dob1ejack
Anda harus membunuh rundengan CTRL + D
Timofey
82

Dari sbt versi 0.13.5 Anda dapat menambahkan ke build.sbt Anda

cancelable in Global := true

Ini didefinisikan sebagai "Mengaktifkan (true) atau menonaktifkan (false) kemampuan untuk mengganggu eksekusi tugas dengan CTRL + C." dalam definisi Keys

Jika Anda menggunakan Scala 2.12.7+, Anda juga dapat membatalkan kompilasi dengan CTRL + C. Referensi https://github.com/scala/scala/pull/6479

Ada beberapa bug yang dilaporkan:

Jonas Anso
sumber
5

Saya telah menemukan yang berikut berguna ketika saya memiliki kendali atas loop utama aplikasi yang dijalankan dari sbt.

Saya memberi tahu sbt untuk bercabang saat menjalankan aplikasi (di build.sbt):

fork in run := true

Saya juga memberi tahu sbt untuk meneruskan stdin dari shell sbt ke aplikasi (di build.sbt):

connectInput in run := true

Akhirnya, di utas utama aplikasi, saya menunggu akhir file di stdin dan kemudian mematikan JVM:

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

Tentu saja, Anda dapat menggunakan utas apa pun untuk membaca stdin dan shutdown, bukan hanya utas utama.

Terakhir, mulai sbt, secara opsional beralih ke subproyek yang ingin Anda jalankan, jalankan.

Sekarang, ketika Anda ingin menghentikan proses, tutup stdin dengan mengetik CTRL-D di shell sbt.

kilo
sumber
1

Pertimbangkan untuk menggunakan sbt-revolver . Kami menggunakannya di perusahaan kami dan ini sangat berguna. Untuk apa yang Anda minta dapat dilakukan dengan:

reStart

reStop

Tanpa perlu mengkonfigurasi file build.sbt.

Anda dapat menggunakan plugin ini dengan menambahkan:

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

Ke proyek / plugins.sbt Anda

mtsokol
sumber