คำตอบสั้น : ส่งSIGTERM
30 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
, และถ้าไม่มีอะไรทำงานSIGFPE
SIGKILL
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