วันแห่งความตายกำลังจะมาถึงและนั่นคือเหตุผลที่เราต้องการทำแบบฝึกหัดเล็ก ๆ น้อย ๆ จาก 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 | 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}')