ปืนลูกซองเสมือนจริง?
ปืนลูกซองเสมือนจริง?
คำตอบ:
โอ้พระเจ้า! ไม่ไม่ไม่. อย่าใช้ kill -9
มันไม่ได้ให้โอกาสในการทำความสะอาด:
ปิดการเชื่อมต่อซ็อกเก็ต
ล้างไฟล์ temp
แจ้งให้ลูกหลานทราบว่ากำลังจะออกไป
รีเซ็ตคุณสมบัติของเทอร์มินัลและอื่น ๆ และอื่น ๆ
โดยทั่วไปแล้วส่ง 15 และรอสักครู่หรือสองวินาทีและถ้านั่นไม่ได้ผลให้ส่ง 2 และถ้าไม่ได้ผลให้ส่ง 1 หากไม่ได้โปรดลบไบนารีเพราะโปรแกรมทำงานผิดปกติ!
อย่าใช้ kill -9 อย่านำเครื่องเกี่ยวนวดเข้าด้วยกันเพื่อทำความสะอาดกระถาง
กระบวนการซอมบี้ (ที่จริงแล้วตอนนี้พวกเขาถูกเรียกว่า<defunct>
) ไม่ใช่กระบวนการจริงๆ มันเป็นเพียงรายการในตารางกระบวนการดังนั้นกระบวนการหลักสามารถทำwait()
syscallได้
คุณไม่ควรกังวลเกี่ยวกับพวกเขา พวกเขาไม่ได้ครอบครองทรัพยากรใด ๆ พวกเขาจะหายไปอย่างใดอย่างหนึ่งเมื่อผู้ปกครองของพวกเขาเรียกwait()
เมื่อพ่อแม่ตัวเองตาย
เป็นกระบวนการที่ได้รับการจัดสรรคืนอย่างสมบูรณ์ แต่ยังคงมีอยู่ในตารางกระบวนการ เปรียบเทียบสิ่งนี้กับกระบวนการของเด็กกำพร้าซึ่งผู้ปกครองเสียชีวิต แต่ยังคงดำเนินการอยู่
มีคำตอบที่ยอมรับแล้ว: คุณสามารถฆ่ากระบวนการซอมบี้ได้ แนบกับดีบักเกอร์กับกระบวนการหลักและเรียกใช้ฟังก์ชัน waitpid เช่น: - สมมติว่าผู้ปกครองมี PID = 100, กระบวนการซอมบี้มี PID = 200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
กระบวนการซอมบี้ไม่มีทรัพยากรที่ถูกจัดสรรให้นอกเหนือจากรายการในแผนผังกระบวนการ สิ่งนี้จะเกิดขึ้นเมื่อกระบวนการเสร็จสมบูรณ์อย่างไรก็ตามกระบวนการหลักยังไม่ได้ทำการเก็บเกี่ยวอีกครั้ง (กล่าวคือwait
แก้ไขในกระบวนการ)
คุณสามารถลองและบังคับให้ผู้ปกครองทำเช่นนี้หากคุณต้องการโดยส่ง SIGCHLD ( kill -20
) ไปยังผู้ปกครอง แต่ไม่มีการรับประกันว่าผู้ปกครองจะให้เกียรติ
คุณมักจะเห็นพวกเขาในช่วงเวลาสั้น ๆ (เช่นในขณะที่ดูแผนผังกระบวนการโดยใช้อันดับต้น ๆ ) - นี่เป็นเรื่องปกติ ในชิ้นเวลาระหว่างเวลาที่กระบวนการเด็กเสร็จสมบูรณ์และผู้ปกครองสำรวจความคิดเห็น - กระบวนการเด็กจะปรากฏเป็นซอมบี้
หากคุณเห็นกระบวนการซอมบี้ที่มีอยู่อย่างต่อเนื่อง - ซึ่งไม่ปกติ - ยังคงไม่ต้องกังวลอีกครั้งเนื่องจากไม่มีทรัพยากรที่จัดสรรให้กับกระบวนการที่ตายแล้ว - โดยทั่วไปหมายความว่าแอปพลิเคชันเขียนได้ไม่ดีโดยนักพัฒนาเส็งเคร็ง
เวลาเดียวที่คุณควรกังวลเกี่ยวกับกระบวนการซอมบี้คือเมื่อคุณเห็นล็อตและจำนวนมากตัวอย่างเช่นหากแอปพลิเคชันเส็งเคร็งดังกล่าวข้างต้นถูกวางไว้ภายใต้การโหลด
เรามีนักพัฒนาเส็งเคร็งจำนวนมากที่ฉันทำงานอยู่และดังนั้นฉันจึงมีสิทธิ์พิเศษในการจัดการกับปัญหาดังกล่าวและเรียนรู้สิ่งที่ไร้ประโยชน์ทุกประเภทในขณะที่ทำเช่นนั้น ในความเป็นจริง - ทีมของฉันมักจะใช้สคริปต์เปลือกเส็งเคร็งที่เขียนโดยนักพัฒนาเส็งเคร็งในการสัมภาษณ์ - ถ้าผู้สมัครสามารถเลือกได้ว่าสคริปต์นั้นน่ารังเกียจจริง ๆ และบอกเราว่าทำไมมันถึงเส็งเคร็ง
สำหรับปืนลูกซองเสมือนจริง ...
$ shoot <pid>
#! / bin / ดวลจุดโทษ เหยื่อ = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{พิมพ์ $ 2}' ' เหยื่อ \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {Vict} \ b" | หัว -n 1 | awk '{พิมพ์ $ 2}' ' #kill $ {Vict} echo "ฆ่า $ {Vict_name}"
และจำไว้ว่าจงยิงพวกมันไว้ในหัวเสมอ
กระบวนการซอมบี้เป็นกระบวนการที่เสร็จสิ้นการดำเนินการ แต่ยังคงอยู่ในตารางกระบวนการ
kill -9 [parent process_name]จะวางมันลงด้วยอคติที่รุนแรง