วิธีการฆ่ากระบวนการที่ไม่สามารถฆ่าได้โดยไม่ต้องรีบูตเครื่อง?


11

มี 5 กระบวนการที่ไม่สามารถฆ่าได้kill -9 $PIDและการดำเนินการcat /proc/$PID/cmdlineจะหยุดเซสชันปัจจุบัน บางทีพวกมันเป็นกระบวนการซอมบี้

การดำเนินการps -ef or htopจะหยุดเซสชันปัจจุบัน แต่topและps -eทำงานได้ดี

ดังนั้นดูเหมือนว่ามีปัญหาสองประการที่ระบบไฟล์ไม่ตอบสนอง

นี่เป็นเครื่องจักรที่ใช้งานจริงที่ใช้งานเครื่องเสมือนดังนั้นการรีบูตจึงไม่ใช่ตัวเลือก

รหัสกระบวนการต่อไปนี้ไม่ทำงาน: 16181 16765 5985 7427 7547

พาเรนต์ของกระบวนการเหล่านี้เริ่มต้น

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

และหนึ่งในกระบวนการ qemu ไม่ทำงาน

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
กระบวนการซอมบี้ไม่ควรทำให้เกิดปัญหา หากจำนวนกระบวนการ Zombie มีขนาดใหญ่เกินขีด จำกัด กระบวนการบนเซิร์ฟเวอร์ก็จะทำให้เกิดปัญหา
Raza

@Salton: เราไม่สามารถใช้ ps -ef และ htop ดังนั้นเราจึงมีปัญหาบางอย่างบางทีสิ่งที่เราเห็นไม่ได้เรียกว่ากระบวนการซอมบี้
Sam Stoelinga

1
คุณสามารถลองติดตามโดยใช้/usr/bin/strace ps -efเพื่อดูว่าคุณps -efแขวนอยู่ตรงไหน
Raza

2
คุณทราบได้อย่างไรว่าเหล่านี้เป็นซอมบี้ ค่อนข้างจะดูเหมือนกระบวนการแขวน ไม่ps -elทำงานและการที่รัฐมีกระบวนการเหล่านี้มีอะไรบ้าง?
นิลส์

ในตอนท้ายไคลเอนต์ยังตัดสินใจที่จะรีบูตเครื่องเนื่องจากปัญหาต่าง ๆ กำลังแย่ลงเรื่อย ๆ ขอบคุณสำหรับทุกท่าน. เรียนรู้มากมายเกี่ยวกับซอมบี้และกระบวนการที่ไม่สามารถแตกได้
Sam Stoelinga

คำตอบ:


22

คุณไม่มีซอมบี้ cat /proc/$PID/cmdlineจะไม่มีปัญหาใด ๆ กับซอมบี้ หากkill -9ไม่ฆ่าโปรแกรมก็หมายความว่าโปรแกรมกำลังดำเนินการ I / O ต่อเนื่อง ซึ่งโดยปกติจะระบุหนึ่งในสามสิ่ง:

  • ระบบไฟล์เครือข่ายที่ไม่ตอบสนอง;
  • ข้อผิดพลาดเคอร์เนล;
  • บั๊กฮาร์ดแวร์

โปรแกรมอรรถประโยชน์เช่นpsอาจหยุดทำงานหากพวกเขาพยายามอ่านข้อมูลบางอย่างเช่นเส้นทางปฏิบัติการของกระบวนการที่เคอร์เนลไม่ได้จัดเตรียมไว้สำหรับหนึ่งในสาเหตุข้างต้น

ลองcat /proc/16181/syscallดูว่ากระบวนการ 16181 กำลังทำอะไรอยู่ สิ่งนี้อาจจะทำงานได้หรือไม่ขึ้นอยู่กับว่าระบบของคุณใช้งานไปนานแค่ไหนแล้ว

หากปัญหาคือระบบไฟล์ของเครือข่ายคุณอาจบังคับให้ถอนติดตั้งหรือให้ออนไลน์ได้ หากปัญหาคือเคอร์เนลหรือฮาร์ดแวร์บั๊กสิ่งที่คุณสามารถทำได้จะขึ้นอยู่กับลักษณะของบั๊ก ขอแนะนำให้บูตเครื่องใหม่ (และอัปเกรดเป็นเคอร์เนลคงที่หรือเปลี่ยนฮาร์ดแวร์ที่เสียหาย)


แมวไม่เคยตอบสนอง ฉันไม่คิดว่านี่เป็นข้อผิดพลาด ฉันคิดว่ามันเป็น "คุณสมบัติ"
Owl

7

คำตอบอื่น ๆ ถือว่าเป็นกระบวนการของซอมบี้ กระบวนการซอมบี้เป็นกระบวนการที่เสร็จสิ้นการทำงาน แต่ยังอยู่ในตารางกระบวนการในกรณีที่ผู้ปกครองต้องการทราบสถานะการออก สิ่งเหล่านี้เป็นเรื่องปกติและinitจะล้างกระบวนการซอมบี้ที่ได้รับมอบหมายโดยอัตโนมัติ

กระบวนการซอมบี้ไม่ควรทำให้อะไรค้างดังนั้นจึงดูเหมือนว่าอาจไม่ใช่ปัญหาของคุณ หากเป็นการเรียกระบบหรือไดรเวอร์หยุดทำงานกระบวนการอาจอยู่ในสถานะไม่หยุดชะงัก มีคำอธิบายที่ดีเป็นที่นี่


กระบวนการซอมบี้มากเกินไปสามารถป้องกันไม่ให้forkประสบความสำเร็จ (เมื่อnrpocเข้าถึงยาก) เพราะพวกเขายังคงใช้พื้นที่ในตารางกระบวนการ
dhchdhd

2

วิธีค้นหากระบวนการซอมบี้บน Linux:

$ ps axo stat, ppid, pid, comm | grep -w ตาย

Z 555 10242 Damn-Zombie <defunct>

ขั้นแรกคุณสามารถลองส่งสัญญาณ SIGCHLD ไปยังกระบวนการปกครองของซอมบี้โดยใช้คำสั่ง kill โปรดทราบว่าคำสั่งดังกล่าวจะให้ PPID (PID ของกระบวนการปกครอง) ของซอมบี้แต่ละตัว ในตัวอย่างของเรา PPID 555ของผีดิบคือ

$ sudo kill -s SIGCHLD 555

หากกระบวนการซอมบี้ยังคงไม่หายไปคุณสามารถฆ่ากระบวนการหลัก (เช่น 555) ของซอมบี้

$ sudo kill -9 555

เมื่อกระบวนการหลักของมันถูกฆ่าซอมบี้จะถูกนำมาใช้โดยกระบวนการเริ่มต้นซึ่งเป็นกระบวนการหลักของทุกกระบวนการใน Linux กระบวนการ init เรียกใช้เป็นระยะwait()เพื่อเก็บเกี่ยวกระบวนการ zombie ใด ๆ


นี่คือคำตอบที่แท้จริง ฆ่าผู้ปกครองได้ผลขอบคุณ
แอนดรู

1

คุณสามารถฆ่าซอมบี้ได้โดยฆ่าผู้ปกครอง กระบวนการซอมบี้ได้ปล่อยทรัพยากรทั้งหมดแล้วและกำลังรอสถานะการออกที่จะรับโดยผู้ปกครอง มันจะกลายเป็นซอมบี้เมื่อผู้ปกครองไม่ดำเนินการwaitเพื่อรับสถานะการออกจากลูกของมัน เมื่อคุณฆ่าพ่อแม่ของซอมบี้แล้วinitหยิบสถานะทางออกและซอมบี้ก็ตายในที่สุด


คุณต้องการให้ฉันฆ่า init หรือไม่ มันไม่ชัดเจนจากคำถามขอโทษนะ แต่ผู้ปกครองดูเหมือนว่าจะ init :( ผมได้แก้ไขคำถาม.
แซม Stoelinga

4
ไม่เราต้องการให้คุณไม่พยายามฆ่าซอมบี้ คุณไม่สามารถฆ่าซอมบี้ คำถามที่พบบ่อยนี้มีอายุเท่า Unix
tripleee

@tripleee: ใช่นั่นคือสิ่งที่ฉันเข้าใจ บางทีสิ่งที่ฉันเป็นไม่ใช่ซอมบี้ htop ไม่ทำงานและ cat / proc / $ pid / cmdline หรือ ls / proc / $ pid / ยังไม่ทำงาน ปกติแล้วสิ่งนี้จะไม่เกิดขึ้นกับซอมบี้นั่นคือสาเหตุที่ฉันถามที่นี่นี่ไม่ใช่ปัญหาทั่วไปของ IMO ฉันได้ตรวจสอบหลายคำตอบที่ทุกคนบอกให้คุณฆ่าผู้ปกครองซึ่งเริ่มต้นในกรณีของฉันหรือเพื่อรีบูต
Sam Stoelinga

1
"Kill the parent" เป็นวิธีการเก็บเกี่ยวซอมบี้ปกติ initคุณไม่สามารถฆ่า หากซอมบี้ถูกโจมตีinitใหม่คุณจะไม่สามารถฆ่ามันได้
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.