อะไรคือวิธีที่ดีที่สุดในการทำความสะอาดหลังการวางระเบิด


21
$ ls
bash: no more processes

เอ่อโอ้. ดูเหมือนว่ามีคนทำระเบิดส้อม ที่ฉันเคยทำงานนี่หมายความว่าเซิร์ฟเวอร์ที่ใช้ร่วมกันจะต้องใช้พลังงานมากเพราะแม้แต่ sysadmins ที่มีรูทมักไม่สามารถทำให้ปัญหาหมดไปได้ บ่อยครั้งที่พวกเขาไม่ได้รับพรอมต์

ฉันได้ยินเคล็ดลับเล็กน้อย (โดยเฉพาะการส่งสัญญาณ STOP แทนที่จะส่งสัญญาณ KILL เนื่องจากหลังจะอนุญาตให้เธรดที่เหลือสามารถแทนที่เธรดที่ถูกฆ่าได้ทันที) แต่ฉันไม่เคยเห็นคู่มือที่ครอบคลุมเรื่องนี้เลย Fork Bomb หรือไม่?

มารวมกัน

คำตอบ:


10

ป้องกันการระเบิดแยกจากที่หลบหนีขีด จำกัด ของกระบวนการที่มีความเหมาะสมต่อการ จำกัด การใช้กระบวนการใช้ulimit

ด้วยวิธีนี้ผู้ใช้คนเดียวจะหมดโควต้ากระบวนการของพวกเขาก่อนที่จะถึงขีด จำกัด ของระบบ


6

สิ่งแรกที่ต้องลองคือการรับผู้ใช้ที่เข้าสู่ระบบออกจากระบบ อาจเป็นไปได้ว่าเชลล์ของพวกเขาอาจเป็นกระบวนการหลักของกระบวนการที่ดำเนินการฟอร์กกิ้งทั้งหมดและอาจจบปัญหา

หากไม่ได้ผลคุณสามารถลองใช้งานkill -STOP -2เป็นรูทเพื่อหยุดกระบวนการทั้งหมดที่ทำงานในฐานะผู้ใช้รายอื่นที่ไม่ใช่รูท หากใช้งานได้คุณสามารถใช้kill -CONT <pid>เพื่อยกเลิกการตรึงกระบวนการบางอย่างที่ไม่เกี่ยวข้องกับ fork bomb และฆ่าพวกมันเพื่อกำจัดปัญหาตารางกระบวนการทั้งหมดและให้คุณมีห้องหายใจเพื่อติดตามและฆ่าต้นตอของปัญหา Sendmail จะเป็นตัวอย่างที่ดีของกระบวนการของระบบในการฆ่าเนื่องจากจะสามารถระบุได้ง่ายโดยใช้ไฟล์. pid เพื่อระบุ pid ตัวอย่างเช่นkill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid).


ระบบปฏิบัติการใดที่คุณเห็นตัวเลือก "-2" สำหรับการฆ่า? ฉันไม่เห็นมันใน man page บน Linux
raldi

1
สิ่งนี้ควรทำงานในระบบปฏิบัติการส่วนใหญ่ในขณะที่คุณกำลังระบุค่าลบสำหรับ pid หาก <pid> น้อยกว่า -1 ดังนั้น kill จะถูกส่งไปยังทุกกระบวนการในกลุ่มกระบวนการ - <pid> การส่ง sig ของ STOP ไปที่ pid -2 ควรหยุดกระบวนการทั้งหมดที่ไม่ใช่กระบวนการระบบพิเศษหรือกระบวนการที่เป็นเจ้าของรูท

ดู manpage การฆ่า (2) สำหรับการฆ่า "ลบ pid" แต่ฉันก็ยังไม่เชื่อว่าจะใช้งานได้ เหตุใดกระบวนการที่ไม่เริ่มต้นทั้งหมดจึงอยู่ในกลุ่มที่ 2 ผมเข้าใจว่าคุณต้องการที่จะหลีกเลี่ยง init เนื่องจากผลของการหยุดมันมักจะร้ายแรงมาก แต่ ...
ephemient

@ephemient 2 ต่ำเกินไปที่จะเป็น id กลุ่มกระบวนการดังนั้นอาจเป็นค่าพิเศษอื่น
joshudson

@Joshua ไม่มีค่าพิเศษข้างมี0และ-1ตามopengroup.org/onlinepubs/009695399/functions/kill.html opengroup.org/onlinepubs/000095399/utilities/kill.html
ephemient

3

ไม่แน่ใจว่าคุณจะส่งสัญญาณ STOP ได้อย่างไรเนื่องจากการวางไข่killจะต้องใช้ตัวจัดการกระบวนการ นอกจากนี้ในระบบประสบการณ์ของฉันมากเกินไปและใช้ไม่ได้นานก่อนที่จะหมดกระบวนการ

คุณได้พิจารณาบังคับใช้ข้อ จำกัด กระบวนการต่อผู้ใช้ด้วยulimitหรือไม่ ที่จะป้องกันผู้ใช้ของคุณจากการเปิดตัว fork bombs (โดยบังเอิญหรือไม่)


3
kill เป็นกระสุนในตัวอย่างน้อยใน bash
raldi

1
ฉันคิดว่ามันเป็นองค์ประกอบสำคัญ - ระบุ builtins สำหรับเปลือกที่คุณเลือก

2
หากไม่ใช่ในตัวคุณสามารถเรียกใช้ "exec kill PID" ซึ่งไม่แยกออก แต่มันมีความเสี่ยงเพราะถ้ามันไม่ได้ผลคุณอาจไม่สามารถหากระสุนใหม่ได้ คิดว่ามันเป็นวิธีการต่อยในการบริหารระบบ!
สตีเฟ่นดาร์ลิงตัน

2

ระบบ BSD บางระบบมีความสามารถในการจอง 5 กระบวนการล่าสุดเพื่อรูท บางทีระบบของคุณอาจมีความสามารถนั้น


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