Halloween บน Linux: วิธีฆ่ากระบวนการซอมบี้

แสตมป์ฮาโลวีน

วันแห่งความตายกำลังจะมาถึงและนั่นคือเหตุผลที่เราต้องการทำแบบฝึกหัดเล็ก ๆ น้อย ๆ จาก LxA เพื่อพูดคุยเกี่ยวกับไฟล์ กระบวนการซอมบี้ และเราจะฆ่าพวกมันได้อย่างไร สิ่งแรกที่ต้องพูดคือกระบวนการ zombie คืออะไรและอย่างที่คุณทราบเคอร์เนลของ Linux มีระบบย่อยในการจัดการกระบวนการและทำงานร่วมกับตัวกำหนดตารางเวลาเพื่อสร้างเปลี่ยนลำดับความสำคัญส่งหรือลบขั้นตอนการประมวลผลของ CPU และ กระบวนการฆ่า ส่วนนี้ของเคอร์เนลเช่นเดียวกับระบบอื่น ๆ ที่คล้ายกับ Unix แยกความแตกต่างระหว่างสถานะต่างๆของกระบวนการ ...

เราจะพบว่า กระบวนการ มันสามารถอยู่ในสถานะสลีป (S) นั่นคือหลับ นอกจากนี้ยังประมวลผลในสถานะกำลังทำงาน (R) ซึ่งเป็นสถานะที่กำลังทำงานหรือกำลังทำงานอยู่กระบวนการรอ (D) ที่หยุดรอการเข้าร่วมการตั้งครรภ์ (T) หรือหยุดชั่วคราวและซอมบี้ (Z) หรือผู้ตาย กระบวนการ zombie หรือ dead คือกระบวนการที่ถูกยุติไปแล้ว แต่มีทรัพยากรระบบบางอย่างถูกแย่งชิงเนื่องจาก Linux ยังคงบันทึกไว้ในตารางกระบวนการ คุณรู้อยู่แล้วว่าเมื่อกระบวนการสิ้นสุดลงไม่ควรอยู่ในสถานะนี้ แต่จะเสร็จสมบูรณ์และเคอร์เนลจะปลดปล่อยทรัพยากรเพื่อให้กระบวนการอื่น ๆ สามารถใช้งานได้โดยทั่วไปจะปลดปล่อย RAM ที่ถูกครอบครอง ...

เนื่องจากกระบวนการซอมบี้ประเภทนี้ไม่น่าสนใจแม้ว่าจะไม่บ่อยเท่า แต่เราสามารถค้นหาและกำจัดได้ตามที่ระบุไว้ที่นี่ สิ่งแรกคือค้นหาว่ามีกระบวนการซอมบี้อยู่ใน distro ของเราหรือไม่และเราสามารถช่วยเหลือตัวเองได้ เครื่องมือเช่นด้านบนหรือเช่น ps. ตัวอย่างเช่นหนึ่งในสองตัวเลือกนี้:

ps -el | grep 'Z'

ps aux | grep defunct

และเมื่อตรวจพบแล้วเราก็ทำได้ ฆ่าเขา โดยตรงกับ:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

แม้ว่าอีกทางเลือกหนึ่งคือการค้นหากระบวนการหลักตั้งแต่ถึง ฆ่ากระบวนการซอมบี้ คุณต้องฆ่ากระบวนการหลักที่รักษากระบวนการดังที่คุณอาจอนุมานได้:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

คุณจะต้องเปลี่ยน ตามรหัสของกระบวนการซอมบี้ที่คุณพบและหากต้องการฆ่าด้วย kill ให้ใช้ ID ของกระบวนการหลักแทนที่ ในตัวอย่างเห็นได้ชัด


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. รับผิดชอบข้อมูล: AB Internet Networks 2008 SL
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

      ทำลูก dijo

    ดีไซต์!
    พวกเขามักจะพาเราออกจากปัญหา

    ที่ไหนพูดว่า:
    แม้ว่าทางเลือกอื่นคือการค้นหากระบวนการหลัก เนื่องจากเพื่อฆ่ากระบวนการซอมบี้ คุณต้องฆ่ากระบวนการหลักที่สนับสนุนกระบวนการดังกล่าว เนื่องจากคุณอาจอนุมานได้:

    1 | ps -eo pid, ppid | grep
    2|
    3 | ฆ่า -9

    คุณจะต้องแทนที่ ID ของกระบวนการซอมบี้ที่คุณพบและเพื่อฆ่ามันด้วยการฆ่า ให้ใช้ ID ของกระบวนการหลักที่แทนที่ในตัวอย่างอย่างชัดเจน

    คุณสามารถเพิ่มสคริปต์:

    $ แมว killppid.sh
    #! / bin / ทุบตี
    ฆ่า -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    แน่นอนว่าไม่ใช่งานที่ผู้ใช้ทั่วไปทำอยู่ตลอดเวลา
    มันจะมีประโยชน์สำหรับผู้ดูแลระบบเท่านั้น แต่การเรียกใช้ในฐานะรูทนั้นเป็นอันตราย เพราะมันสามารถฆ่ากระบวนการใดๆ ในระบบได้

    ใน man kill มีข้อความนี้:

    หมายเหตุ เชลล์ของคุณ (ตัวแปลคำสั่ง) อาจมีคำสั่ง kill ในตัว คุณอาจ
    จำเป็นต้องเรียกใช้คำสั่งที่อธิบายไว้ที่นี่ว่า / bin / kill เพื่อแก้ไขข้อขัดแย้ง

    Bash มีคำสั่งนั้น นี่เป็นส่วนหนึ่งของ man bash เกี่ยวกับมัน:

    ฆ่า [-s sigspec | -n signum | -sigspec] [pid | สเปคงาน] ...
    ฆ่า -l | -L [sigspec | exit_status]
    ส่งสัญญาณที่ตั้งชื่อโดย sigspec หรือ signum ไปยังกระบวนการที่ตั้งชื่อโดย pid หรือ job
    ข้อมูลจำเพาะ sigspec เป็นชื่อสัญญาณที่ไม่คำนึงถึงขนาดตัวพิมพ์ เช่น SIGKILL (ด้วย or
    ไม่มีคำนำหน้า SIG) หรือหมายเลขสัญญาณ signum คือหมายเลขสัญญาณ ถ้า
    sigspec ไม่มีอยู่ ดังนั้นจะถือว่า SIGTERM อาร์กิวเมนต์ของ -l แสดงรายการ
    ชื่อสัญญาณ หากมีการระบุอาร์กิวเมนต์เมื่อให้ -l ชื่อของ
    สัญญาณที่สอดคล้องกับอาร์กิวเมนต์จะแสดงรายการ และสถานะการส่งคืนคือ 0
    อาร์กิวเมนต์ exit_status ของ -l คือตัวเลขที่ระบุหมายเลขสัญญาณหรือ
    สถานะการออกของกระบวนการสิ้นสุดลงโดยสัญญาณ ตัวเลือก -L เทียบเท่า
    ให้ยืม -l kill คืนค่า จริง หากส่งสัญญาณสำเร็จอย่างน้อยหนึ่งสัญญาณ หรือ
    false หากเกิดข้อผิดพลาดหรือพบตัวเลือกที่ไม่ถูกต้อง

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

    $ แมว killppid.sh
    #! / bin / ทุบตี
    ถ้า [$ USER == "root"]
    จากนั้น echo อย่าเรียกใช้ $ 0 ในฐานะรูท !!! มันอันตราย!
    ทางออก
    fi

    ฆ่า -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    ใช้ bash's kill ไม่ใช่ / bin / kill

    คุณเห็นได้อย่างไรว่าฉันไม่ค่อยชำนาญในการทุบตี
    คุณรู้วิธีการเขียนสคริปต์ที่ปลอดภัยที่ทำงานในฐานะผู้ใช้ของกระบวนการลูก แม้ว่าจะรันในฐานะรูทหรือไม่?
    สิ่งที่เทียบเท่ากับสิ่งที่จะทำด้วยตนเองเช่นนี้:

    $ ซู;
    $ ฆ่า -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')