มีวิธีใดที่จะฆ่ากระบวนการซอมบี้โดยไม่ต้องรีบูตหรือไม่?


48

มีวิธีใดที่จะฆ่ากระบวนการซอมบี้โดยไม่ต้องรีบูตหรือไม่? นี่คือวิธีที่มันเกิดขึ้น:

ฉันต้องการดาวน์โหลดไฟล์ 12GB โดยใช้ฝนตกหนัก หลังจากเพิ่มไฟล์ .torrent แล้วการส่งข้อมูลก็กลายเป็นกระบวนการซอมบี้ (ฉันลองใช้ ktorrent ด้วยเช่นกัน) ในที่สุดฉันก็สามารถดาวน์โหลดไฟล์โดยใช้μTorrent แต่หลังจากปิดโปรแกรมมันก็กลายเป็นซอมบี้เช่นกัน

ฉันพยายามใช้kill, skillและpkillมีตัวเลือกที่แตกต่างกันและ-9สัญญาณ แต่ไม่ประสบความสำเร็จ

หลังจากอ่านวิธีแก้ปัญหาบนเว็บแล้วฉันพบว่าการฆ่าพ่อแม่สามารถฆ่าซอมบี้ได้ แต่การฆ่าไวน์ก็ไม่ได้ช่วยอะไรเช่นกัน

มีวิธีอื่นอีกไหม?

แก้ไข:

ps -o pid, ppid, stat, comm

PID  PPID STAT COMMAND
7121  2692 Ss   bash
7317  7121 R+   ps

pstree เอาท์พุท:

init─┬─GoogleTalkPlugi───4*[{GoogleTalkPlug}]
 ├─NetworkManager─┬─dhclient
 │                └─{NetworkManager}
 ├─acpid
 ├─amarok───19*[{amarok}]
 ├─apache2───5*[apache2]
 ├─atd
 ├─avahi-daemon───avahi-daemon
 ├─bonobo-activati───{bonobo-activat}
 ├─clock-applet
 ├─console-kit-dae───63*[{console-kit-da}]
 ├─cron
 ├─cupsd
 ├─2*[dbus-daemon]
 ├─2*[dbus-launch]
 ├─desktopcouch-se───desktopcouch-se
 ├─firefox───run-mozilla.sh───firefox-bin─┬─plugin-containe───8*[{plugin-contain}]
 │                                        └─14*[{firefox-bin}]
 ├─gconfd-2
 ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg
 │            │                 ├─gdm-session-wor─┬─gnome-session─┬─bluetooth-apple
 │            │                 │                 │               ├─compiz───sh───gtk-window-deco
 │            │                 │                 │               ├─fusion-icon
 │            │                 │                 │               ├─gdu-notificatio
 │            │                 │                 │               ├─gnome-panel───{gnome-panel}
 │            │                 │                 │               ├─gnome-power-man
 │            │                 │                 │               ├─gpg-agent
 │            │                 │                 │               ├─gwibber-service
 │            │                 │                 │               ├─nautilus
 │            │                 │                 │               ├─nm-applet
 │            │                 │                 │               ├─polkit-gnome-au
 │            │                 │                 │               ├─2*[python]
 │            │                 │                 │               ├─qstardict───{qstardict}
 │            │                 │                 │               ├─ssh-agent
 │            │                 │                 │               ├─tracker-applet
 │            │                 │                 │               ├─trackerd
 │            │                 │                 │               ├─wakoopa─┬─wakoopa
 │            │                 │                 │               │         └─3*[{wakoopa}]
 │            │                 │                 │               └─{gnome-session}
 │            │                 │                 └─{gdm-session-wo}
 │            │                 └─{gdm-simple-sla}
 │            └─{gdm-binary}
 ├─6*[getty]
 ├─gnome-keyring-d───2*[{gnome-keyring-}]
 ├─gnome-screensav
 ├─gnome-settings-
 ├─gnome-system-mo
 ├─gnome-terminal─┬─bash───ssh
 │                ├─bash───pstree
 │                ├─gnome-pty-helpe
 │                └─{gnome-terminal}
 ├─gvfs-afc-volume───{gvfs-afc-volum}
 ├─gvfs-fuse-daemo───3*[{gvfs-fuse-daem}]
 ├─gvfs-gdu-volume
 ├─gvfsd
 ├─gvfsd-burn
 ├─gvfsd-computer
 ├─gvfsd-metadata
 ├─gvfsd-trash
 ├─hald─┬─hald-runner─┬─hald-addon-acpi
 │      │             ├─hald-addon-cpuf
 │      │             ├─hald-addon-inpu
 │      │             └─hald-addon-stor
 │      └─{hald}
 ├─indicator-apple
 ├─indicator-me-se
 ├─indicator-sessi
 ├─irqbalance
 ├─kded4
 ├─kdeinit4─┬─kio_http_cache_
 │          └─klauncher
 ├─kglobalaccel
 ├─modem-manager
 ├─multiload-apple
 ├─mysqld───10*[{mysqld}]
 ├─named───10*[{named}]
 ├─nmbd
 ├─notification-ar
 ├─notify-osd
 ├─polkitd
 ├─pulseaudio─┬─gconf-helper
 │            └─2*[{pulseaudio}]
 ├─rsyslogd───2*[{rsyslogd}]
 ├─rtkit-daemon───2*[{rtkit-daemon}]
 ├─smbd───smbd
 ├─snmpd
 ├─sshd
 ├─timidity
 ├─trashapplet
 ├─udevd───2*[udevd]
 ├─udisks-daemon─┬─udisks-daemon
 │               └─{udisks-daemon}
 ├─upowerd
 ├─upstart-udev-br
 ├─utorrent.exe───{utorrent.exe}
 ├─vnstatd
 ├─winbindd───2*[winbindd]
 ├─wnck-applet
 ├─wpa_supplicant
 └─xinetd

การตรวจสอบระบบและการแสดงกระบวนการซอมบี้กำลังใช้ทรัพยากร:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข 2: ฉันคิดว่าฉันพบบางสิ่ง ฉันพยายามออกจากระบบและเห็นข้อความนี้:

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากไคลเอนต์ฝนตกหนักอื่นมีปัญหาเดียวกันอาจเป็นเรื่องเกี่ยวกับขนาดไฟล์ฉันใช้ Ubuntu 10.04 บนพาร์ติชั่น ext4 การฆ่าหอยโข่งและการส่งสัญญาณ SIGCHLD ไปใช้ไม่ได้


คุณสามารถเพิ่มผลลัพธ์ของps -o pid,ppid,stat,commและpstreeคำถามของคุณ?
Mikel

ฉันมีปัญหาเดียวกันที่นี่และหลังจาก googling ดูเหมือนว่าจะเกิดขึ้นเมื่อมีการเข้ารหัสโฟลเดอร์บ้านของคุณระหว่างการติดตั้งและเลือกที่จะดาวน์โหลดเพลงที่มีขนาดใหญ่กว่า 4gb ฉันไม่สามารถหาวิธีอื่นนอกเหนือจากการรีบูตเพื่อกำจัดกระบวนการซอมบี้ที่กินซีพียู 99% bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975ดูเหมือนว่าจะจัดการกับเรื่องนี้ แต่ดูเหมือนว่าจะไม่มีอะไรทำเพื่อแก้ปัญหานี้ :(
user972876

นอกจากนี้โปรดอ่านที่นี่: askubuntu.com/questions/48624/what-are-zombie-processesนี่จะช่วยแก้ข้อสงสัยมากมาย
Luis Alvarado

คำตอบ:


41

ฉันไม่ได้ทำสิ่งที่กระบวนการผีดิบจะปวดหัวมาก กระบวนการซอมบี้ไม่ได้ใช้ทรัพยากรใด ๆ เป็นเพียงว่ามันมีรายการในตารางกระบวนการ

กระบวนการซอมบี้ไม่ใช่กระบวนการเด็กกำพร้า แต่มีกระบวนการปกครอง

kill, skill pkillจะไม่ทำงานตั้งแต่กระบวนการถูกฆ่าตายอยู่แล้วเพียงแค่ว่ามันเป็นรายการที่ยังไม่ได้ถูกลบออก

กระบวนการซอมบี้สามารถฆ่าได้โดยการส่งSIGCHLDสัญญาณไปยังผู้ปกครอง ฉันคิดว่าจำนวนสัญญาณของSIGCHLDเป็น17หรือ18

หากสิ่งนี้ล้มเหลวคุณอาจต้องฆ่าผู้ปกครองเอง

จาก Wikipedia บนสัญญาณ SIGCHLD:

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


แก้ไข 1 : ทรัพยากรระบบที่ใช้ส่วนใหญ่เป็นรายการตารางกระบวนการ หากใครรู้ว่ามันกินมากกว่านั้น - หน่วยความจำหรือรอบ CPU แล้วโปรดเพิ่มคำอธิบาย AFAIK แทบไม่ต้องใช้ทรัพยากรระบบใด ๆ เลย


แก้ไข 2: การอ้างอิงจาก Wikipedia

บนระบบปฏิบัติการคอมพิวเตอร์ Unix และ Unix like กระบวนการ zombie หรือกระบวนการ defunct เป็นกระบวนการที่ดำเนินการเสร็จสิ้นแล้ว แต่ยังมีรายการในตารางกระบวนการ รายการนี้ยังคงต้องการให้กระบวนการที่เริ่มกระบวนการ (ตอนนี้ zombie) อ่านสถานะการออก

ดังนั้นรายการจะถูกเก็บไว้เพื่อให้กระบวนการผู้ปกครองสามารถทราบสถานะการออกเพราะช่วงเวลาที่เด็กออกจากผู้ปกครองอาจไม่ได้อยู่ในสถานะหรือไม่พร้อมที่จะอ่านมันเป็นสถานะทางออก


แก้ไข 3

จนถึงวันที่ฉันไม่เคยพบกับกระบวนการซอมบี้ที่ใช้ CPU 100% เห็นสิ่งนี้เป็นครั้งแรก

ลองทำ killall utorrent.exe

ฉันสามารถเห็นได้ว่ามีสองกรณีutorrent.exeและหนึ่งในนั้นคือซอมบี้ อาจเป็นอันที่สอง (ลูก) killall ควรฆ่าพาเรนต์เนื่องจากไม่สามารถฆ่าเด็ก (zombie)


แก้ไข 4

ดูเหมือนว่า killall จะไม่ทำงานเนื่องจากได้ให้สัญญาณ TERM แทน KILL

ลองดู killall --signal=KILL utorrent.exe

หากวิธีนี้ใช้ไม่ได้ให้ลองฆ่ากระบวนการอย่างเลือก

รับรายการของกระบวนการ utorrent.exe PID

ps -e | grep -i utorrent

คุณควรได้รับสองกระบวนการเช่น

xxxx ?        aa:bb:cc utorrent.exe defunct
yyyy ?        aa:bb:cc utorrent.exe

ดังนั้นอันที่สองคือผู้ปกครอง ฆ่ามันโดยใช้

ฆ่า -9 ปปปป

แก้ไข 5

โปรดลองค้นหารหัสผู้ปกครองของกระบวนการโดยคำสั่ง bash นี้

cat / proc / {defunctpid} / status | grep -i ppid

ในกรณีของคุณคือ

cat / proc / 7298 / สถานะ | grep -i ppid

หากออกมาเหมือน

PPid: 1

ถ้าอย่างนั้นฉันคิดว่าคุณโชคไม่ดี ID กระบวนการ1เป็นของ init โดยที่ระบบของคุณไม่สามารถทำงานได้


2
คุณเขียนและอ้างถึงA zombie process does not take up any resources the child is still consuming system resources ... it is known as a zombie process
maaartinus

ใช่. ฉันอัปเดตโพสต์เพื่อให้ชัดเจนว่าฉันหมายถึงอะไร
Manish Sinha

7
กระบวนการ zombie ใช้เวลาหนึ่งในแกนประมวลผล CPU ของฉันทั้งหมดการใช้งานแกนประมวลผลนั้นอยู่ที่ 100% ดังนั้นมันจึงไม่ใช่แค่รายการตารางกระบวนการฉันจะเพิ่มข้อมูลเพิ่มเติมให้กับคำถาม
Pedram

3
ซอมบี้ที่ใช้ CPU อาจใช้งานเธรดพื้นหลัง ลองใช้top -Hเพื่อแสดงเธรดแทนกระบวนการด้านบน
Zan Lynx

1
ปัญหาหลักของกระบวนการที่เลิกใช้คือพวกเขาใช้พอร์ตที่ใช้ในที่สุด
pietrovismara

10

การใช้killกระบวนการเองนั้นไม่ได้ผลจริงเนื่องจากกระบวนการนั้นมีอยู่แล้ว killนำกระบวนการสดไปสู่สถานะซอมบี้

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

การฆ่าพาเรนต์ของกระบวนการซอมบี้นั้นมักจะมีผลเพราะกระบวนการซอมบี้นั้นเปลี่ยนกลับไปinitเป็นพาเรนต์ของมันทันทีที่กระบวนการพาเรนต์หายไป (เช่นการฆ่าพ่อแม่ได้เปลี่ยนกระบวนการเป็นซอมบี้และปู่ย่าตายายอ่าน ดังนั้นผู้ปกครองจึงจากไปอย่างแท้จริง) ซอมบี้สามารถเป็นพาเรนต์ไปยังซอมบี้ดังนั้นเพียงการฆ่าพาเรนต์นั้นไม่เพียงพอจึงต้องมีการรวบรวมโดยกระบวนการอื่นด้วย

โปรดทราบว่ากระบวนการจะไม่รับผิดชอบในการทำความสะอาดลูกหลานของพวกเขา - พวกเขามักจะกลับไปสู่กระบวนการที่ 1 ในฐานะผู้ปกครอง (ซึ่งเป็นสาเหตุที่บางครั้งผู้เขียน daemon ใช้ double fork () และยุติกระบวนการที่อยู่ตรงกลาง เปลือก)

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


ขอบคุณสำหรับข้อมูล แต่วิธีการแก้ปัญหาคืออะไร?
Pedram

1
ฆ่ากระบวนการผู้ปกครองที่แท้จริงคือกระบวนการที่ps wauxแสดงในPPIDคอลัมน์สำหรับซอมบี้
Simon Richter

อย่างที่คุณเห็นใน pstree output "utorrent.exe" ไม่มี parent ใด ๆ
Pedram

มีสองกระบวนการที่ใช้ชื่อนั้นโดยที่หนึ่งเป็นลูกของอีกกระบวนการ ฉันสงสัยว่าซอมบี้เป็นเด็กซึ่งจะทำให้กระบวนการ "utorrent.exe" ของผู้ปกครองรับผิดชอบการล้างข้อมูล หากคุณฆ่ากระบวนการนั้นจากนั้น init จะทำความสะอาดพาเรนต์หลังจากนั้นเด็กจะถูกแนบใหม่เพื่อเริ่มต้นและทำความสะอาดทันทีเช่นกัน
Simon Richter

killall ไม่ทำงานในกรณีนั้นฉันเริ่ม µTorrent แล้วและไม่มีผู้ปกครองหรือเด็ก แต่ยังไม่สามารถฆ่าได้ผลผลิต pstree ได้รับการอัปเดต
Pedram

3

วิธีที่ง่ายกว่า killall, -9, ฯลฯ :

1) ใช้ qBitorrent แทนคอนโซล uTorrent (ฉันกำลังรอรุ่น GUI เช่นกันและ qBitorrent ก็สำคัญด้วย)

2) ถ้าคุณใช้ 11.04 หรือสูงกว่าให้กด alt + f2 (เปิดหน้าต่างคำสั่งพิเศษ) พิมพ์ xkill และเมาส์ของคุณคือ x คลิกที่โปรแกรมที่คุณต้องการปิด (UI = รหัสกระบวนการ) และมันจะฆ่าคุณ

เคล็ดลับขั้นสูง: ผูกแป้นพิมพ์ลัดสำหรับ "xkill" อย่างที่ฉันมีบนแป้นพิมพ์แมโคร G15 ของฉัน


1

ในกรณีของฉันเมื่อไวน์แฮงค์และฉันไม่สามารถฆ่าเด็ก Zombie ด้วยปืนลูกซองฉันจะทำ:

wineserver -kจากนั้นฉันจะฆ่า "บุตรแห่งกระบวนการ" killall -9 Oblivion.exe(ตัวอย่าง)

สำหรับสิ่งที่ฉันเข้าใจผู้ผลิตไวน์ส่งสัญญาณไปยัง Zombie Childs ทุกตัวที่พวกเขากำลังจะตาย (เพราะปืนลูกซองที่คุณรู้จัก) แต่บางครั้งเด็ก ๆ ก็คิดด้วยตัวเองและต้องการที่จะยึดครองโลกโดยพายุ ดังนั้นฉันจะทำเพิ่มเติมkillall -9หรือkill -9ด้วย id ของกระบวนการ


มันไม่ทำงานเช่นกันนอกจากการส่งและ ktorrent มีปัญหาเดียวกันและพวกเขาไม่มีอะไรเกี่ยวข้องกับไวน์
Pedram

ฉันกำลังพูดถึงส่วนที่เกี่ยวกับการใช้ utorrent กับไวน์เป็นไวน์แม่และ utorrent เด็ก อย่างไรก็ตามคุณพยายามส่งสัญญาณไปยังผู้ปกครองเพื่อให้ทราบว่าลูกของมันเป็นซอมบี้ (สิ่งที่ผู้ปกครองไม่พร้อม) ตัวอย่างเช่น:kill -s SIGCHLD ppid
Luis Alvarado

คุณมีฮาร์ดแวร์ประเภทใดดังนั้นมันอาจช่วยในการค้นหาว่าซอมบี้สามารถใช้ทรัพยากรให้สูงสุดได้อย่างไร
Luis Alvarado

โชคไม่ดีที่ใช้งานไม่ได้
Pedram

โปรเซสเซอร์ของฉันคือคอร์ i7 860
Pedram

-4

ฉันเดาว่าคุณกำลังใช้ SSD อยู่

เมื่อเพิ่ม torrents ขนาดใหญ่ให้กับไคลเอนต์ torrent ไฟล์ "placeholder" ของ torrent ที่คุณกำลังดาวน์โหลดจะถูกสร้างขึ้นบนดิสก์ แต่จะว่างเปล่าจนกว่าจะเต็มไปเรื่อย ๆ ระหว่างกระบวนการดาวน์โหลด

ด้วยฮาร์ดดิสก์ปกติดิสก์นั้นเป็นคอขวดและคุณจะไม่สังเกตเห็นปัญหาประสิทธิภาพการทำงานของเดสก์ท็อปที่เหลือ

เมื่อใช้ SSD อย่างไรก็ตาม CPU เป็นคอขวดและแอปพลิเคชันดูเหมือนจะผิดพลาด (กลายเป็นสีเทา) หากคุณทิ้งไว้ครู่หนึ่งมันก็จะฟื้นตัวและทุกอย่างจะดีขึ้น นี่เป็นประสบการณ์ของฉันตั้งแต่เปลี่ยนมาใช้ SSD

ในเรื่องของกระบวนการฆ่าคนอื่น ๆ ได้ให้คำแนะนำที่ดีกว่าที่ฉันทำได้ - การใช้สัญญาณ KILL นั้นใช้งานได้ แต่ฉันมีของแปลก ๆ ที่ต้องรีสตาร์ทในช่วงหลายปีที่ผ่านมา


1
ขอบคุณ แต่ฉันใช้ฮาร์ดดิสก์ปกติ
Pedram

1
"เมื่อใช้ SSD แต่ CPU เป็นคอขวดและแอปพลิเคชันดูเหมือนจะทำงานผิดพลาด (กลายเป็นสีเทา) หากคุณทิ้งไว้ครู่หนึ่งมันจะทำการกู้คืนและทุกอย่างจะดีขึ้น" ในสถานการณ์นั้นกระบวนการไม่ใช่ซอมบี้ กระบวนการและกระบวนการของซอมบี้ในการนอนหลับที่ไม่หยุดชะงักนั้นไม่เหมือนกัน กระบวนการซอมบี้อย่างแท้จริงไม่ได้ทำงานอีกต่อไปไม่ใช้ทรัพยากร (ยกเว้นรายการเดียวในตารางกระบวนการ) และไม่สามารถกลับมามีชีวิตได้อีก
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.