มีหลายวิธีในการปิดแอปพลิเคชันสปริง หนึ่งคือการโทรปิด () บนApplicationContext
:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
คำถามของคุณแนะนำให้คุณต้องการปิดแอปพลิเคชันของคุณโดยทำCtrl+C
ซึ่งมักใช้ในการยุติคำสั่ง ในกรณีนี้...
ใช้endpoints.shutdown.enabled=true
ไม่ใช่สูตรที่ดีที่สุด หมายความว่าคุณเปิดเผยจุดสิ้นสุดเพื่อยุติการสมัครของคุณ ดังนั้นขึ้นอยู่กับกรณีการใช้งานและสภาพแวดล้อมของคุณคุณจะต้องรักษาความปลอดภัย ...
Ctrl+C
ควรทำงานได้ดีในกรณีของคุณ ฉันถือว่าปัญหาของคุณเกิดจากเครื่องหมายและ (&) คำอธิบายเพิ่มเติม:
Spring Application Context อาจมีการลงทะเบียน hook การปิดระบบกับรันไทม์ JVM โปรดดูเอกสาร ApplicationContext
ฉันไม่รู้ว่า Spring Boot กำหนดค่า hook นี้โดยอัตโนมัติตามที่คุณพูดหรือไม่ ฉันคิดว่ามันเป็น
บนCtrl+C
เชลล์ของคุณส่งINT
สัญญาณไปยังแอปพลิเคชันเบื้องหน้า หมายความว่า "โปรดขัดจังหวะการดำเนินการของคุณ" แอปพลิเคชันสามารถดักจับสัญญาณนี้และทำการล้างข้อมูลก่อนที่จะยุติ (เบ็ดที่ลงทะเบียนโดย Spring) หรือเพียงแค่เพิกเฉย (ไม่ดี)
nohup
คือคำสั่งที่รันโปรแกรมต่อไปนี้โดยใช้กับดักเพื่อละเว้นสัญญาณ HUP HUP ใช้เพื่อยุติโปรแกรมเมื่อคุณวางสาย (เช่นปิด ssh connexion ของคุณ) นอกจากนี้ยังเปลี่ยนเส้นทางเอาต์พุตเพื่อหลีกเลี่ยงไม่ให้โปรแกรมของคุณบล็อกบน TTY ที่หายไป nohup
ไม่ละเว้นสัญญาณ INT ดังนั้นจึงไม่ขัดขวางCtrl+C
การทำงาน
ฉันถือว่าปัญหาของคุณเกิดจากเครื่องหมายและ (&) ไม่ใช่จาก nohup Ctrl+C
ส่งสัญญาณไปยังกระบวนการเบื้องหน้า เครื่องหมายและทำให้แอปพลิเคชันของคุณทำงานในพื้นหลัง ทางออกเดียว: ทำ
kill -INT pid
ใช้kill -9
หรือkill -KILL
ไม่ดีเนื่องจากแอปพลิเคชัน (ในที่นี้คือ JVM) ไม่สามารถดักจับให้ยุติได้อย่างสง่างาม
อีกวิธีหนึ่งคือการนำแอปพลิเคชันของคุณกลับมาใช้งานล่วงหน้า แล้วCtrl+C
จะทำงาน. fg
มีลักษณะที่ควบคุมทุบตีงานอย่างแม่นยำมากขึ้นบน