killall ไม่ได้ฆ่าทั้งหมดและไม่ค่อยฆ่าคำสั่งนั้นคืออะไร?


12

ฉันใช้killallคำสั่งเพื่อฆ่ากระบวนการเป็นครั้งคราว เหตุผลที่ฉันบอกว่าบางครั้งมันไม่ได้ผลสำหรับฉัน

ตัวอย่างล่าสุดคือธันเดอร์เบิร์ดที่มีหน่วยความจำประมาณ 5 อินดังนั้นฉันจึงตัดสินใจใช้killallคำสั่ง มันฆ่า 2 กระบวนการและ 3 ถูกทิ้งไว้ในหน่วยความจำ พยายามอีกครั้งและทั้งสามยังคงอยู่ที่นั่น

ดังนั้นฉันใช้kill -9คำสั่งด้วยตนเองเพื่อฆ่าแต่ละกระบวนการผ่าน pids ของพวกเขา ที่ได้ผล

ฉันส่วนใหญ่ใช้kill -9คำสั่งตามที่ได้ผล killallคำสั่งมีให้ฉันลงหลายครั้งผมก็ไม่รำคาญใช้มัน แต่ต้องมีเหตุผลว่าทำไมมันไม่ทำงาน ฉันใช้ผิดหรือเปล่า?

ฉันรู้ว่ามีคำสั่งอื่น ๆ เช่นpkillแต่ฉันจะขอบคุณที่เข้าใจว่าทำไมkillallคำสั่งไม่ทำงานตามที่คาดไว้ ฉันได้พยายามฆ่าเพียงแค่กระบวนการเดียวและมันก็เป็นเรื่องฮิตและคิดถึง แต่kill -9คำสั่งทำงานทุกครั้ง

ความคิดใด ๆ

PS: sudoไม่ได้สร้างความแตกต่าง

คำตอบ:


22

จาก 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 ได้


การคาดเดาใด ๆ ว่าทำไมมันถึงฆ่าอินสแตนซ์ของธันเดอร์เบิร์ดเพียงบางส่วนเท่านั้น?
Meer Borg

@Doogfar ดูการเขียนที่แก้ไขของฉัน (หรือหน้าที่ฉันเชื่อมโยง)
tgm4883

ขอบคุณยังอธิบายว่าทำไมธันเดอร์เบิร์ดของฉันถึงกับเสียหายการสังหาร -9 นั้นรุนแรงเกินไป
Meer Borg

ยังคงไม่ทำงานเสมอ
Craig Hicks

4

killallkillยอมรับมากที่สุดของไวยากรณ์เช่นเดียวกับ โดยเฉพาะอย่างยิ่งมีความจำเป็นที่จะเขียนอะไรแฟนซีไม่มีที่จะทำให้การทำเทียบเท่าkillall kill -9มันใช้งานได้ดี:

killall -9 thunderbird

(แน่นอนตามที่กล่าวไว้คุณควรลังเลที่จะใช้งานkillall -9หรือเท่าkillall -KILLๆ กันเว้นแต่จะมีการทดลองใช้อื่น ๆ โดยไม่ประสบความสำเร็จ)


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