ทางเลือกอื่นในการฆ่ากระบวนการซอมบี้


19

ฉันเพิ่งสังเกตเห็นกระบวนการซอมบี้ใน CentOS 6.8 (รอบชิงชนะเลิศ) พยายามฆ่าพวกเขา แต่พวกเขายังคงอยู่ที่นั่น:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

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


1
คุณเคยลองkill -9ไหม
Ipor Sircer

7
เท่านั้น747และ29971เป็นกระบวนการซอมบี้ คนอื่นอาจถูกล็อค แต่พวกเขายังไม่ตาย
roaima

ดูเหมือนว่าคุณมีข้อผิดพลาดในโค้ดบางส่วนที่ทำงานบนโพง ...
บอริสไปเดอร์

คำตอบ:


8

ตามที่ Heemayl พูดถึงคุณไม่สามารถฆ่าซอมบี้ได้ ตอนนี้ [un] ตายแล้ว ...

อย่างไรก็ตามปัญหาที่คุณเผชิญดูเหมือนว่ามีปัญหากับgit cloneคำสั่ง มันติดอยู่อย่างใด อาจจะหมดเวลาหรือล้มเหลวในทางอื่น? บ่อยครั้งเป็นเพราะ I / O บางอย่างที่กระบวนการติดอยู่กับจุดที่ a SIGTERMและSIGINTไม่ทำงาน

หากต้องการฆ่ามันในกรณีนี้คุณต้องการใช้-9ตัวเลือกบรรทัดคำสั่ง นี่หมายถึงส่งSIGKILLสัญญาณ คุณสามารถใช้งานได้จริง-KILLเช่นกัน

[root@host user]# kill -KILL 746 29970

ในการรับรายการสัญญาณที่มีให้ใช้ตัวเลือกรายการบรรทัดคำสั่ง

[root@host user]# kill -l

สิ่งนี้แสดงตัวเลขและชื่อให้กับคุณ (และคุณจะเห็นว่า # 9 พูดว่า SIGKILL)


1
จริงๆแล้วkill -KILLเป็นคำสั่งเดียวที่สามารถปิดกระบวนการเหล่านี้ได้ด้วยเหตุนี้ฉันจะตอบ @Alexis Wilke แต่แน่นอนว่าฉันต้องการจะแสดงความขอบคุณต่อ @heemayl ที่รวดเร็วเฉลียวและตอบคำถามได้ดี +1 ขอบคุณทุกคน
หมิ่น

39

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

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

kill -CHLD <PPID>

(แทนที่<PPID>ด้วย PID จริงของผู้ปกครอง)

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


8
คุณสามารถส่ง SIGCHLD ไปยังผู้ปกครองเพื่อแจ้งให้ทราบว่าหากเด็ก ๆ เลิกใช้งาน (เช่นขอให้รวบรวมสถานะการออกของเด็ก) สัญญาณนี้สามารถถูกละเว้นได้ (ค่าเริ่มต้น) ปัญหาที่เกิดขึ้นคือหากกระบวนการเพิกเฉยSIGCHLDไม่มีซอมบี้ จะถูกสร้างขึ้น ดังนั้นถ้ามันไม่เพิกเฉยSIGCHLDและซอมบี้ก็ไม่ได้รับการเก็บเกี่ยวกระบวนการนี้อาจเป็นรถหรือไม่สนใจเด็ก ๆ ที่เป็นซอมบี้ จากขั้นตอนที่เป็นปัญหาgit clone ...ฉันพนันได้เลยว่ามันไม่สนใจเด็กผีดิบเพราะมันเป็นกระบวนการระยะสั้น (หวังว่า) ที่ทำงานของมันแล้วออกไป
Andrew Henle

1
@AndrewHenle: ในขณะที่ส่วนใหญ่เป็นความจริงการกระทำเริ่มต้น ( SIG_DFL) สำหรับSIGCHILDก็ไม่สนใจเช่นกัน แต่ในกรณีนี้ซอมบี้ส่วนใหญ่จะไม่ได้รับการแปลใหม่โดยอัตโนมัติ
..

@R ในขณะที่ส่วนใหญ่เป็นความจริงการกระทำเริ่มต้น ( SIG_DFL) สำหรับSIGCHILDยังไม่สนใจ แต่ในกรณีนี้ซอมบี้ส่วนใหญ่จะไม่ได้รับการแปลใหม่โดยอัตโนมัติ ฉันไม่แน่ใจว่าคุณหมายถึงอะไร คุณหมายถึงกระบวนการที่ไม่ได้รับการตอบรับในคำถามหรือไม่? ฉันไม่เห็นว่าการส่งSIGCHLDไปยังกระบวนการที่SIGCHLDตั้งค่าตัวจัดการเป็นSIG_IGN(อย่างชัดเจนหรือโดยค่าเริ่มต้น) จะทำให้กระบวนการดังกล่าวเก็บเกี่ยวซอมบี้ใด ๆ
Andrew Henle

1
@ AndrewHenle การส่ง a SIGCHLDอาจใช้งานได้ในเวลานี้ ครั้งสุดท้ายที่มันอาจพลาดสัญญาณหรือเด็กสองคนเสียชีวิตในเวลาเดียวกันและรหัสไม่ฉลาดพอที่จะจัดการกับความตายทั้งสองพร้อมกัน
Alexis Wilke

มันไม่สามารถทำร้ายได้ แต่ฉันจะไม่ยอมให้มันทำงาน
Barmar

2

เพื่อค้นหากระบวนการซอมบี้:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

เพื่อฆ่ากระบวนการซอมบี้ ID หลักจะต้องถูกฆ่าเช่น PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

เมื่อกระบวนการหลักตายกระบวนการซอมบี้ทั้งหมดจะถูกล้าง อย่าฆ่ากระบวนการผู้ปกครองเพียงเพื่อล้างกระบวนการซอมบี้ มันจะกลับมาอีกครั้งเมื่อคุณรันโปรแกรมอีกครั้ง แก้ไขโปรแกรมของคุณด้วยการโทรอย่างถูกต้อง“ wait ()” หรือ“ waitpid ()” การโทรของระบบ

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