คุณจะยุติการรันใน SBT โดยไม่ออกได้อย่างไร?
ฉันพยายาม CTRL + C แต่ออกจาก SBT มีวิธีออกจากแอปพลิเคชันที่กำลังทำงานอยู่ในขณะที่เปิด SBT อยู่หรือไม่?
Ctrl + D
ใช้ได้กับ Play framework เท่านั้น
คุณจะยุติการรันใน SBT โดยไม่ออกได้อย่างไร?
ฉันพยายาม CTRL + C แต่ออกจาก SBT มีวิธีออกจากแอปพลิเคชันที่กำลังทำงานอยู่ในขณะที่เปิด SBT อยู่หรือไม่?
Ctrl + D
ใช้ได้กับ Play framework เท่านั้น
คำตอบ:
ในการกำหนดค่าเริ่มต้นการรันของคุณจะเกิดขึ้นใน JVM เดียวกันกับที่ sbt ทำงานอยู่ดังนั้นคุณจึงไม่สามารถฆ่าแยกกันได้อย่างง่ายดาย
หากคุณทำการรันใน JVM แยกต่างหากตามที่อธิบายไว้ในForkingคุณสามารถฆ่า JVM นั้นได้ (โดยวิธีใดก็ได้ที่ระบบปฏิบัติการของคุณเสนอ) โดยไม่กระทบกับ JVM ของ sbt:
fork in run := true
kill
จากบรรทัดคำสั่งหรือในที่ Task Manager (Windows) หรือบังคับให้ออกหรือกิจกรรมการตรวจสอบ (Mac OS X) ฯลฯ
kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
run
ด้วย CTRL + D
จาก 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
มีรายงานข้อบกพร่องบางอย่าง:
ฉันพบว่าสิ่งต่อไปนี้มีประโยชน์เมื่อฉันควบคุมลูปหลักของแอปพลิเคชันที่เรียกใช้จาก sbt
ฉันบอกให้ sbt แยกเมื่อเรียกใช้แอปพลิเคชัน (ใน build.sbt):
fork in run := true
ฉันยังบอกให้ sbt ส่งต่อ stdin จากเชลล์ sbt ไปยังแอปพลิเคชัน (ใน build.sbt):
connectInput in run := true
สุดท้ายในเธรดหลักของแอปพลิเคชันฉันรอ end-of-file บน stdin จากนั้นปิด JVM:
while (System.in.read() != -1) {}
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)
แน่นอนคุณสามารถใช้เธรดใดก็ได้เพื่ออ่าน stdin และ shutdown ไม่ใช่เฉพาะเธรดหลัก
สุดท้ายเริ่มต้น sbt หรือสลับไปยังโครงการย่อยที่คุณต้องการเรียกใช้เรียกใช้
ตอนนี้เมื่อคุณต้องการหยุดกระบวนการให้ปิด stdin โดยพิมพ์ CTRL-D ใน sbt เชลล์
Ctrl+D
ไม่ทำงาน, ไม่เป็นผล.