โปรแกรมที่เขียนไม่ดีหรือการแสดงไม่ดีสามารถออกไปได้ กระบวนการซอมบี้ ซุ่มซ่อนอยู่ในคอมพิวเตอร์ Linux ของคุณ ค้นหาว่าซอมบี้สร้างขึ้นอย่างไรและในที่สุดคุณสามารถวางพวกเขาเพื่อพักผ่อนได้อย่างไร
กระบวนการของกระบวนการทำงานอย่างไรกับ Linux
แน่นอน Linux แน่นอนต้องติดตามแอปพลิเคชันทั้งหมดและ Daemons ที่ทำงานบนคอมพิวเตอร์ของคุณ หนึ่งในวิธีที่มันทำเช่นนี้คือการรักษาตารางกระบวนการ นี่คือรายการของโครงสร้างในหน่วยความจำเคอร์เนล แต่ละกระบวนการมีรายการในรายการนี้ที่มีข้อมูลบางอย่างเกี่ยวกับมัน
ไม่มีข้อตกลงที่สำคัญในแต่ละโครงสร้างโต๊ะกระบวนการ พวกเขาถือ รหัสกระบวนการ , รายการข้อมูลอื่น ๆ สองสามรายการและตัวชี้ไปยังบล็อกการควบคุมกระบวนการ (PCB) สำหรับกระบวนการนั้น
มันเป็น PCB ที่มีรายละเอียดมากมาย Linux จำเป็นต้องค้นหาหรือตั้งค่าสำหรับแต่ละกระบวนการ PCB ได้รับการอัปเดตเป็นกระบวนการที่สร้างขึ้นเนื่องจากเวลาในการประมวลผลและทำลายในที่สุด
Linux PCB มีมากกว่า 95 ฟิลด์
มันถูกกำหนดไว้
เป็นโครงสร้างที่เรียกว่า
task_sruct.h
และมีความยาวมากกว่า 700 เส้น PCB มีข้อมูลประเภทต่อไปนี้:
- สถานะกระบวนการ : รัฐต่าง ๆ อธิบายไว้ด้านล่าง
- หมายเลขกระบวนการ : ตัวระบุที่เป็นเอกลักษณ์ในระบบปฏิบัติการ
- โปรแกรมเคาน์เตอร์โปรแกรม : เมื่อกระบวนการนี้มีการเข้าถึงซีพียูต่อไประบบจะใช้ที่อยู่นี้เพื่อค้นหาคำสั่งถัดไปของกระบวนการที่ควรดำเนินการ
- การลงทะเบียน : รายการของ CPU registers ที่ใช้โดยกระบวนการนี้ รายการอาจมีการสะสมดัชนีลงทะเบียนและพอยน์เตอร์สแต็ค
- เปิดรายการไฟล์ : ไฟล์ที่เกี่ยวข้องกับกระบวนการนี้
- ข้อมูลการตั้งเวลา CPU : ใช้เพื่อกำหนดวิธีการที่บ่อยครั้งและระยะเวลาการประมวลผล CPU จะมอบให้กับกระบวนการนี้ ลำดับความสำคัญของกระบวนการชี้ไปที่คิวการตั้งเวลาและพารามิเตอร์การตั้งเวลาอื่น ๆ จะต้องบันทึกใน PCB
- ข้อมูลการจัดการหน่วยความจำ : รายละเอียดเกี่ยวกับหน่วยความจำกระบวนการนี้ใช้เช่นที่อยู่เริ่มต้นและสิ้นสุดของหน่วยความจำกระบวนการและพอยน์เตอร์ไปยังหน้าหน่วยความจำ
- ข้อมูลสถานะ I / O : อุปกรณ์ใด ๆ ในหรือเอาต์พุตที่ใช้โดยกระบวนการ
"สถานะกระบวนการ" อาจเป็นสิ่งใดต่อไปนี้:
- NS: กระบวนการทำงานหรือ runnable การใช้งานหมายถึงการได้รับรอบ CPU และการดำเนินการ กระบวนการที่ใช้ runnable พร้อมที่จะทำงานและรอช่องเสียบ CPU
- NS: กระบวนการนอนหลับ กระบวนการกำลังรอการดำเนินการให้เสร็จสมบูรณ์เช่นการดำเนินการในหรือเอาต์พุตหรือสำหรับทรัพยากรที่จะใช้งานได้
- NS: กระบวนการอยู่ในสถานะการนอนหลับที่ไม่ต่อเนื่อง มันใช้การเรียกระบบการปิดกั้นและไม่สามารถดำเนินการต่อได้จนกว่าการเรียกระบบจะเสร็จสมบูรณ์ ซึ่งแตกต่างจากสถานะ "นอนหลับ" กระบวนการในสถานะนี้จะไม่ตอบสนองต่อสัญญาณจนกว่าการเรียกระบบจะเสร็จสมบูรณ์และการดำเนินการได้กลับไปที่กระบวนการ
-
NS:
กระบวนการสิ้นสุดลง (หยุด) เพราะมันได้รับ
sigstopสัญญาณ. มัน จะตอบสนองเท่านั้น ไปที่sigkillหรือsigcontสัญญาณซึ่งฆ่ากระบวนการหรือสั่งให้ดำเนินการต่อตามลำดับ นี่คือสิ่งที่เกิดขึ้นเมื่อคุณสลับจาก เบื้องหน้า (fg) ถึง พื้นหลัง (bg)งาน. -
Z:
กระบวนการซอมบี้ เมื่อกระบวนการเสร็จสมบูรณ์มันไม่เพียง แต่หายไป มันทำให้หน่วยความจำเพิ่มขึ้นและลบตัวเองออกจากหน่วยความจำ แต่รายการในตารางกระบวนการและ PCB ยังคงอยู่ สถานะของมันถูกตั้งค่าเป็น
exit_zombieและกระบวนการหลักจะได้รับแจ้ง (โดยsigchldสัญญาณ) ว่ากระบวนการเด็กเสร็จสิ้น
ในสถานะซอมบี้กระบวนการผู้ปกครองเรียกหนึ่งใน
รอ()
ครอบครัวของฟังก์ชั่น
เมื่อกระบวนการเด็กจะถูกสร้างขึ้น จากนั้นก็รอให้มีการเปลี่ยนแปลงของรัฐในกระบวนการเด็ก ได้กระบวนการเด็กถูกหยุดต่อเนื่องหรือถูกฆ่าตายโดยสัญญาณ? มันมีการยกเลิกโดยวิ่งผ่านเสร็จสิ้นตามธรรมชาติของรหัสของตนหรือไม่
ถ้าเปลี่ยนสถานะเป็นหนึ่งในที่หมายถึงกระบวนการเด็กได้หยุดการทำงานรหัสทางออกของมันคือการอ่าน จากนั้น PCB ของเด็กที่ถูกทำลายและเข้าในตารางกระบวนการจะถูกลบออก อุดมคตินี้ทั้งหมดที่เกิดขึ้นในพริบตาและกระบวนการในรัฐผีดิบไม่อยู่นานมาก
ที่เกี่ยวข้อง: วิธีการเรียกใช้และการควบคุมกระบวนการพื้นหลังบน Linux
สิ่งที่ทำให้เกิดกระบวนการผีดิบบนลินุกซ์?
กระบวนการปกครองเขียนไม่ดีอาจจะไม่เรียก
รอ()
ฟังก์ชั่นเมื่อกระบวนการเด็กจะถูกสร้างขึ้น นี้ไม่มีอะไรหมายถึงจะดูการเปลี่ยนแปลงของรัฐในกระบวนการเด็กและ
sigchld
สัญญาณจะถูกละเว้น หรือบางทีโปรแกรมอื่นมีผลกระทบต่อการดำเนินการของการปกครองอย่างใดอย่างหนึ่งเกิดจากการเขียนโปรแกรมที่ไม่ดีหรือเจตนาร้าย
แต่ถ้าการปกครองที่ไม่ได้เฝ้าดูการเปลี่ยนแปลงของรัฐในกระบวนการเด็กที่ดูแลทำความสะอาดระบบที่เหมาะสมจะไม่เกิดขึ้น PCB และรายการในตารางขั้นตอนที่จะไม่ถูกลบเมื่อสิ้นสุดกระบวนการเด็ก ผลนี้ในรัฐผีดิบไม่เคยถูกลบออกจากแผ่น PCB
ซอมบี้จะใช้บิตของหน่วยความจำ แต่พวกเขามักจะไม่ก่อให้เกิดปัญหา รายการในตารางกระบวนการที่มีขนาดเล็ก แต่จนกว่าจะมีการปล่อยตัวกระบวนการ ID ไม่สามารถนำกลับมาใช้ บนระบบปฏิบัติการ 64 บิตที่ไม่น่าจะก่อให้เกิดปัญหาใด ๆ เพราะแผ่น PCB มีขนาดใหญ่กว่ารายการตารางกระบวนการ
จำนวนมากของซอมบี้สามารถ, น่ากลัวส่งผลกระทบต่อปริมาณของหน่วยความจำที่ฟรีสำหรับกระบวนการอื่น ๆ หากคุณมีที่ซอมบี้มากแม้ว่าคุณได้มีปัญหาร้ายแรงกับแอพลิเคชันที่ผู้ปกครองหรือข้อผิดพลาดของระบบปฏิบัติการ
วิธีการลบกระบวนการผีดิบ
คุณไม่สามารถฆ่ากระบวนการผีดิบเพราะมันตายไปแล้ว มันจะไม่ตอบสนองต่อสัญญาณใด ๆ เพราะมันถูกลบออกจากหน่วยความจำมีไม่มีที่ไหนเลยที่จะส่ง
sigkill
สัญญาณ. คุณสามารถลองส่ง
sigchld
สัญญาณการปกครอง แต่ถ้ามันไม่ได้ทำงานเมื่อกระบวนการเด็กยกเลิกก็ไม่น่าที่จะทำงานในขณะนี้อย่างใดอย่างหนึ่ง
วิธีการแก้ปัญหาที่เชื่อถือได้เท่านั้นคือการฆ่าการปกครอง เมื่อมันสิ้นสุดกระบวนการที่เด็กที่ได้รับการสืบทอดมาจาก
ในนั้น
กระบวนการซึ่งเป็นขั้นตอนแรกที่จะทำงานในระบบ Linux (ID กระบวนการของมันคือ 1)
NS
ในนั้น
ขั้นตอนการดำเนินการเป็นประจำล้างจำเป็นของซอมบี้เพื่อที่จะฆ่าพวกเขาคุณเพียงแค่ต้องฆ่ากระบวนการที่สร้างพวกเขา NS
สูงสุด
คำสั่งเป็นวิธีที่สะดวกในการดูว่าคุณมีซอมบี้ใด ๆ
พิมพ์ต่อไปนี้:
บน
ระบบนี้มีแปดกระบวนการผีดิบ เรา
สามารถแสดงรายการเหล่านี้
โดยใช้
ป.ล.
สั่งการ
และลงในท่อ
egrep
. อีกครั้งกระบวนการผีดิบมีธงของรัฐ“Z” และคุณจะมักจะยังดูที่“ตาย”.
พิมพ์ต่อไปนี้:
PS aux | egrep "Z | ตาย"
กระบวนการผีดิบมีการระบุไว้
นี้เป็นวิธีที่ neater เพื่อค้นพบรหัสกระบวนการของซอมบี้กว่าการเลื่อนไปมาผ่าน
สูงสุด
. นอกจากนี้เรายังเห็นว่าโปรแกรมที่เรียกว่า“badprg” กลับกลายเหล่าซอมบี้
กระบวนการ ID ของผีดิบแรกคือ 7641 แต่เราต้องไปหากระบวนการ ID ของกระบวนการแม่ของมัน เราสามารถทำได้โดยการใช้
อีกครั้ง. เราจะใช้ตัวเลือกการส่งออก (
ป.ล.
-o
) บอก
ป.ล.
เพื่อแสดงเฉพาะกระบวนการ ID ของผู้ปกครองแล้วผ่านมันไปด้วย
PPID =
ธง.
กระบวนการที่เราต้องการที่จะหาจะถูกระบุโดยใช้
-NS
(กระบวนการ) ตัวเลือกและจากนั้นผ่านกระบวนการ ID ของผีดิบ
ดังนั้นเราพิมพ์คำสั่งต่อไปนี้เพื่อค้นหาข้อมูลกระบวนการสำหรับกระบวนการ 7641 แต่มันจะรายงานเฉพาะ ID ของกระบวนการปกครอง:
PS -o PPID = -p 7641
เรากำลังบอกว่ารหัสการปกครองเป็น 7636. ตอนนี้เราสามารถข้ามอ้างอิงนี้โดยใช้
ป.ล.
อีกที.
เราเห็นว่าสิ่งนี้ตรงกับชื่อของกระบวนการหลักตั้งแต่ก่อนหน้านี้ ในการฆ่ากระบวนการหลักให้ใช้ตัวเลือก sigkill กับคำสั่ง kill ดังต่อไปนี้:
Kill -sigkill 7636
ขึ้นอยู่กับเจ้าของกระบวนการหลักคุณอาจต้องใช้
sudo
.
ซอมบี้ไม่น่ากลัว ...
... เว้นแต่พวกเขาจะอยู่ในฝูงชนขนาดใหญ่ ไม่กี่คนที่ไม่ต้องกังวลและการรีบูตอย่างง่าย ๆ จะเช็ดออก
อย่างไรก็ตามหากคุณสังเกตเห็นว่าแอปพลิเคชันหรือกระบวนการเป็นซอมบี้ที่วางไข่เสมอนั่นคือสิ่งที่คุณควรพิจารณา เป็นไปได้มากว่าเป็นเพียงโปรแกรมที่เขียนด้วย Sloppily ซึ่งในกรณีนี้อาจมีรุ่นที่อัปเดตที่ชำระเงินอย่างถูกต้องหลังจากกระบวนการลูก