จาก man page สำหรับ killall
killall ส่งสัญญาณไปยังกระบวนการทั้งหมดที่รันคำสั่งที่ระบุ หากไม่ได้ระบุชื่อสัญญาณ SIGTERM จะถูกส่ง
เมื่อคุณทำkill -9
คุณจะส่งสัญญาณ SIGKILL หากคุณต้องการส่ง SIGKILL พร้อม killall คุณต้องทำ
killall -s SIGKILL <PROCESSNAME>
คำอธิบายที่ดีเกี่ยวกับความแตกต่างระหว่าง SIGKILL และ SIGTERM (และทำไมคุณควรลอง SIGTERM ก่อน)
จากhttp://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/
การส่งสัญญาณไปยังกระบวนการที่ใช้ kill บนระบบ Unix ไม่ใช่หัวข้อใหม่สำหรับผู้ดูแลระบบส่วนใหญ่ แต่ฉันถูกถามหลายครั้งเกี่ยวกับความแตกต่างระหว่าง kill และ kill -9
เมื่อใดก็ตามที่คุณใช้ kill ในกระบวนการคุณจะส่งสัญญาณ (ในเกือบทุกสถานการณ์ - ฉันจะเข้าสู่กระบวนการในไม่ช้า) แอปพลิเคชันมาตรฐาน C มีไฟล์ส่วนหัวที่มีขั้นตอนที่กระบวนการควรปฏิบัติตามหากได้รับสัญญาณเฉพาะ คุณสามารถดูรายการสัญญาณทั้งหมดที่มีอยู่ในระบบของคุณโดยตรวจสอบหน้า man สำหรับการฆ่า
พิจารณาคำสั่งเช่นนี้:
kill 2563
สิ่งนี้จะส่งสัญญาณที่เรียกว่า SIGTERM ไปยังกระบวนการ เมื่อกระบวนการได้รับการแจ้งให้ทราบอาจมีสิ่งต่าง ๆ เกิดขึ้น:
- กระบวนการอาจหยุดทันที
- กระบวนการอาจหยุดทำงานหลังจากเกิดความล่าช้าเล็กน้อยหลังจากทำความสะอาดทรัพยากร
- กระบวนการอาจทำงานต่อไปเรื่อย ๆ
แอปพลิเคชันสามารถกำหนดสิ่งที่ต้องการทำเมื่อได้รับ SIGTERM ในขณะที่แอปพลิเคชันส่วนใหญ่จะล้างทรัพยากรและหยุดบางส่วนอาจไม่ แอปพลิเคชันอาจถูกกำหนดค่าให้ทำสิ่งที่แตกต่างอย่างสิ้นเชิงเมื่อได้รับ SIGTERM นอกจากนี้หากแอปพลิเคชันอยู่ในสถานะไม่ดีเช่นการรอดิสก์ I / O มันอาจไม่สามารถทำงานกับสัญญาณที่ถูกส่ง
ผู้ดูแลระบบส่วนใหญ่มักจะหันไปใช้สัญญาณที่ฉับพลันมากขึ้นเมื่อแอปพลิเคชันไม่ตอบสนองต่อ SIGTERM:
kill -9 2563
-9 บอกคำสั่ง kill ว่าคุณต้องการส่งสัญญาณ # 9 ซึ่งเรียกว่า SIGKILL ด้วยชื่อเช่นนั้นมันชัดเจนว่าสัญญาณนี้มีน้ำหนักเพิ่มขึ้นเล็กน้อย
แม้ว่า SIGKILL จะถูกกำหนดในไฟล์ส่วนหัวสัญญาณเดียวกันกับ SIGTERM แต่กระบวนการนั้นไม่สามารถเพิกเฉยได้ ในความเป็นจริงกระบวนการไม่ได้ตระหนักถึงสัญญาณ SIGKILL เนื่องจากสัญญาณตรงไปยังเคอร์เนล init ณ จุดนี้ init จะหยุดกระบวนการ กระบวนการไม่เคยได้รับโอกาสในการจับสัญญาณและดำเนินการกับมัน
อย่างไรก็ตามเคอร์เนลอาจไม่สามารถฆ่ากระบวนการในบางสถานการณ์ได้สำเร็จ หากกระบวนการกำลังรอเครือข่ายหรือดิสก์ I / O เคอร์เนลจะไม่สามารถหยุดได้ กระบวนการของซอมบี้และกระบวนการที่ติดอยู่ในโหมดสแนปอินไม่สามารถหยุดทำงานได้โดยเคอร์เนล จำเป็นต้องรีบูตเพื่อล้างกระบวนการเหล่านั้นออกจากระบบ
เมื่อคุณส่ง killall (SIGTERM) ไปยังกระบวนการธันเดอร์เบิร์ดคุณขอให้กระบวนการเหล่านั้นหยุด กระบวนการบางอย่างนั้นทำงานไม่ถูกต้อง (อาจเป็นสาเหตุที่คุณต้องฆ่าพวกมันตั้งแต่แรก) ดังนั้นพวกเขาจึงไม่สามารถทำงานกับสัญญาณ SIGTERM ได้