คำตอบสั้น : ส่งSIGTERM30 SIGKILLวินาทีต่อมา นั่นคือส่งSIGTERMรอสักครู่ (อาจแตกต่างกันไปในแต่ละโปรแกรมคุณอาจรู้จักระบบของคุณดีกว่า แต่ 5 ถึง 30 วินาทีก็เพียงพอแล้วเมื่อปิดเครื่องคุณอาจเห็นว่าเครื่องรอโดยอัตโนมัติถึง 1'30 วินาที ทำไมรีบร้อนหลังจากทั้งหมด?) SIGKILLแล้วส่ง
เหมาะสมคำตอบ : SIGTERM, SIGINT, SIGKILL
นี้เป็นมากกว่าเพียงพอ กระบวนการที่จะมากSIGKILLอาจจะยุติก่อน
นานคำตอบ : SIGTERM, SIGINT, SIGQUIT, SIGABRT,SIGKILL
สิ่งนี้ไม่จำเป็น แต่อย่างน้อยคุณก็ไม่ทำให้กระบวนการเกี่ยวกับข้อความของคุณเข้าใจผิด สัญญาณทั้งหมดเหล่านี้ไม่ได้หมายความว่าคุณต้องการให้กระบวนการที่จะหยุดสิ่งที่ทำและออก
ไม่ว่าคุณจะเลือกคำตอบใดจากคำอธิบายนี้โปรดจำไว้ว่า!
หากคุณส่งสัญญาณที่มีความหมายอย่างอื่นกระบวนการอาจจัดการด้วยวิธีที่แตกต่างกันมาก (ในแง่หนึ่ง) ในทางกลับกันหากกระบวนการไม่จัดการกับสัญญาณไม่สำคัญว่าคุณจะส่งอะไรไปกระบวนการก็จะหยุดทำงานอยู่ดี (เมื่อการดำเนินการเริ่มต้นสิ้นสุดลงแน่นอน)
ดังนั้นคุณต้องคิดว่าตัวเองเป็นโปรแกรมเมอร์ คุณจะเขียนโค้ดตัวจัดการฟังก์ชันSIGHUPเพื่อออกจากโปรแกรมที่เชื่อมต่อกับบางสิ่งหรือคุณจะวนซ้ำเพื่อพยายามเชื่อมต่ออีกครั้ง นั่นคือคำถามหลักที่นี่! นั่นคือเหตุผลที่สำคัญเพียงแค่ส่งสัญญาณที่หมายถึงสิ่งที่คุณตั้งใจ
คำตอบยาวเกือบโง่ :
ตารางร้องประกอบด้วยสัญญาณที่เกี่ยวข้องและการดำเนินการเริ่มต้นในกรณีที่โปรแกรมไม่สามารถจัดการได้
ฉันสั่งพวกเขาตามลำดับที่ฉันแนะนำให้ใช้ (BTW ฉันขอแนะนำให้คุณใช้คำตอบที่สมเหตุสมผลไม่ใช่คำตอบนี้ที่นี่) หากคุณต้องการลองทั้งหมดจริงๆ (มันจะสนุกดีที่จะบอกว่าตารางได้รับคำสั่งในแง่ของ การทำลายล้างที่อาจก่อให้เกิด แต่นั่นไม่เป็นความจริงอย่างสมบูรณ์ )
ไม่แนะนำให้ใช้สัญญาณที่มีเครื่องหมายดอกจัน (*) สิ่งสำคัญเกี่ยวกับสิ่งเหล่านี้คือคุณอาจไม่เคยรู้มาก่อนว่ามีโปรแกรมให้ทำอะไร พิเศษSIGUSR! มันอาจเริ่มต้น apocalipse (เป็นสัญญาณฟรีสำหรับโปรแกรมเมอร์ที่ทำอะไรก็ได้ที่เขา / เธอต้องการ!) แต่หากไม่ได้รับการจัดการหรือในกรณีที่ไม่น่าจะถูกจัดการให้ยุติโปรแกรมจะยุติลง
ในตารางสัญญาณที่มีตัวเลือกเริ่มต้นในการยุติและสร้างการถ่ายโอนข้อมูลหลักจะถูกทิ้งไว้ในตอนท้ายก่อนหน้าSIGKILLนี้
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
แล้วผมจะแนะนำสำหรับการนี้คำตอบยาวเกือบโง่ :
SIGTERM, SIGINT, SIGHUP, SIGPIPE, SIGQUIT, SIGABRT,SIGKILL
และสุดท้าย
คำตอบยาว ๆ โง่แน่นอน :
อย่าลองทำที่บ้าน
SIGTERM, SIGINT, SIGHUP, SIGPIPE, SIGALRM, SIGUSR2, SIGUSR1, SIGQUIT, SIGABRT, SIGSEGV, SIGILL, และถ้าไม่มีอะไรทำงานSIGFPESIGKILL
SIGUSR2ควรทดลองใช้ก่อนSIGUSR1เพราะเราจะดีกว่าถ้าโปรแกรมไม่จัดการสัญญาณ และมีแนวโน้มที่จะจัดการได้มากขึ้นSIGUSR1หากจัดการเพียงหนึ่งในนั้น
BTW, the KILL : ไม่ใช่เรื่องผิดที่จะส่งSIGKILLไปยังกระบวนการตามคำตอบอื่น ๆ ที่ระบุไว้ คิดว่าจะเกิดอะไรขึ้นเมื่อคุณส่งshutdownคำสั่ง? มันจะพยายามSIGTERMและSIGKILLเท่านั้น ทำไมคุณถึงคิดว่าเป็นเช่นนั้น? แล้วทำไมคุณถึงต้องการสัญญาณอื่น ๆ ถ้าshutdownคำสั่งvery ใช้แค่สองอย่างนี้?
ตอนนี้กลับไปที่คำตอบยาวนี่คือ oneliner ที่ดี:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
มันจะหลับเป็นเวลา 30 วินาทีระหว่างสัญญาณ ทำไมคุณถึงต้องการoneliner อีก ? ;)
นอกจากนี้ยังแนะนำ: ลองกับสัญญาณเฉพาะ15 2 9จากคำตอบที่เหมาะสม
ความปลอดภัย : ลบวินาทีechoเมื่อคุณพร้อมที่จะไป ฉันเรียกมันว่าของฉันdry-runสำหรับออนไลเนอร์ ควรใช้เพื่อทดสอบเสมอ
สคริปต์ฆ่าอย่างรุนแรง
จริงๆแล้วฉันรู้สึกทึ่งกับคำถามนี้มากจนตัดสินใจสร้างสคริปต์เล็ก ๆ เพื่อทำสิ่งนั้น โปรดดาวน์โหลด (โคลน) ได้ที่นี่:
ลิงก์ GitHub ไปยังที่เก็บ Killgracefully