เมื่อคุณพยายามที่จะยุติกระบวนการที่ดีคุณควรใช้ตัวเลือก“ ฆ่า” แบบใด?


26

ฉันได้รับข้อความมากมายจากผู้คนและสงสัยว่าจริงๆแล้วมันมีความแตกต่างไม่มากในสิ่งที่คุณใช้

kill 'x'
killall 'x'
kill -9 'x'

นี่คือตัวเลือกบางอย่างที่ฉันได้รับคำสั่งให้ใช้จนถึงตอนนี้ แต่บางคนบอกว่า kill -9 เป็นเพียง overkill การฆ่าด้วยตัวเองไม่ทำงาน ฯลฯ

ใครบ้างมีคำแนะนำใด ๆ ที่ควรใช้ในกรณีมาตรฐานมากที่สุดเพียงแค่ยกเลิกกระบวนการ (และทำให้สถานะของมันเช่นกัน)?

[แก้ไข] ฉันกำลังมองหาสิ่งที่จะใช้เมื่อคุณต้องการที่จะหยุดการดำเนินการของกระบวนการของคุณเพื่อให้คุณสามารถเรียกใช้ใหม่สดจากจุดเริ่มต้น


1
ดูเพิ่มเติมฟอร์มจดหมาย UUK9SIGKILLซึ่งข้อควรระวังกับการเหยียดหยาม
jw013

1
ไปที่รายการทั้งหมดสัญญาณที่แตกต่างกันตามด้วยหมายเลขของพวกเขาkill -lและการแปลหมายเลขชื่อสัญญาณที่สอดคล้องกันเช่นจะกลับมาkill -l 9 KILL

คำตอบ:


24

มีสัญญาณจำนวนหนึ่งที่การจัดการเริ่มต้นคือการยุติกระบวนการ สัญญาณการเลิกจ้างขั้นสุดท้ายคือ SIGKILL เนื่องจากไม่สามารถจัดการได้และกระบวนการไม่มีทางเลือกนอกจากให้ตาย อย่างไรก็ตามนี่ก็หมายความว่าถ้าคุณส่งมันกระบวนการจะถูกลิดรอนโอกาสในการล้างข้อมูล ดังนั้นมารยาทที่ดีต้องส่งสัญญาณเช่น SIGTERM ที่สามารถจัดการได้ก่อนและเมื่อกระบวนการไม่ออกหลังจากเวลาผ่านไปส่ง SIGKILL

โปรดทราบว่า SIGINT และ SIGQUIT ไม่ใช่ผู้สมัครที่ดีสำหรับการยกเลิกกระบวนการโดยพลการ เนื่องจากความจริงที่ว่ามันสามารถสร้างขึ้นได้จากคีย์บอร์ดของเทอร์มินัลแอปพลิเคชั่นจำนวนมากใช้เพื่อวัตถุประสงค์พิเศษ ตัวอย่างเช่น python interpreter ใช้ SIGINT เพื่อสร้างKeyboardInterruptข้อยกเว้น (เช่นในเซสชัน python แบบโต้ตอบซึ่งมันกลับไปที่พรอมต์) และ JVM ใช้ SIGQUIT เพื่อถ่ายโอนร่องรอยสแต็ก SIGINT และ SIGQUIT ทำยังคงมีประสิทธิภาพมากที่สุดสำหรับสาธารณูปโภคมาตรฐานบรรทัดคำสั่งที่ชอบหรือfindcat

ระหว่างการปิดระบบระบบ UNIX และ Linux ส่วนใหญ่ส่ง SIGTERM ไปยังกระบวนการทั้งหมดตามด้วยรอ 5 วินาทีตามด้วย SIGKILL นี่เป็นวิธีที่แนะนำในการปิดกระบวนการโดยพลการ

โปรดทราบด้วยว่าแม้ SIGKILL อาจไม่ยุติกระบวนการที่ค้างอยู่ในการรอเครื่องสำรองจนกว่ากระบวนการจะกลับมาทำงานอีกครั้ง


1
คำตอบที่ยอดเยี่ยม คุณมีการอ้างอิงสำหรับkill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;คำแนะนำหรือไม่?
l0b0

+1 คำตอบ แล้ว SIGHUP ล่ะ?
Alois Mahdal

2
@AloisMahdal: SIGHUPมาจากวันที่มีสายเรียกเข้าเป็นเรื่องธรรมดา สัญญาณนั้นถูกส่งไปเพื่อระบุว่าสายวางสาย ต่อมาเมื่อSIGHUPบางครั้ง daemons ที่ใช้กันทั่วไปน้อยกว่าจะอ่านไฟล์ปรับแต่งใหม่โดยไม่ต้องเริ่มกระบวนการใหม่ ในยุคปัจจุบันSIGHUPนี้ไม่ค่อยมีคนใช้ daemons จำนวนมากจะมีวิธีการเริ่มต้นใหม่ของตนเอง (เช่นapachectl gracefulหรือrndc reconfigสำหรับสิ่งที่คุณไม่ควรใช้[init.d|smf|upstart|launchd]การควบคุมหากทำได้
bahamat

13

คุณควรเริ่มต้นด้วยความอ่อนโยนและขยายจากที่นั่น ซึ่งหมายความว่า SIGINT, SIGTERM, SIGQUIT, SIGKILL แม้ว่าคนส่วนใหญ่ข้าม SIGINT และ SIGQUIT


นอกจากนี้บางแอปพลิเคชัน (เช่น JDK) จะจัดการ SIGQUIT ต่างกัน ฉันอาจจะไม่ใช้ SIGQUIT โดยไม่ทราบว่าแอปพลิเคชันเฉพาะจัดการอย่างไร
dimo414
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.