วิธีการฆ่ากระบวนการ <defunct> ด้วย parent 1


17

ฉันใช้ Bacula บนกล่อง RedHat เมื่อเวลาผ่านไป, การจัดเก็บภูต Bacula-SD <defunct>หยุดทำงานและจะกลายเป็น

[root@backup ~]# ps -ef | grep defunct | more
root      4801 29261  0 09:25 pts/5    00:00:00 grep defunct
root      5825     1  0 Oct18 ?        00:00:00 [bacula-sd] <defunct>

คำถามของฉันคือฉันจะฆ่ากระบวนการนี้ได้อย่างไร ผู้ปกครองของมันคือ 1 ซึ่งเป็น init เท่าที่ฉันรู้และฉันไม่ต้องการที่จะฆ่ากระบวนการเริ่มต้นฉันจะทำอย่างไร

'ปกติ' การฆ่ากระบวนการนี้จะไม่ทำงาน:

[root@backup ~]# kill -0 5825
[root@backup ~]# kill -9 5825

ความช่วยเหลือได้รับการชื่นชมอย่างมาก!

แก้ไข: กำลังทำงาน

[root@backup ~]# lsof -p 5825

สร้างเอาต์พุตต่อไปนี้:

COMMAND    PID USER   FD   TYPE  DEVICE     SIZE    NODE NAME
bacula-sd 5825 root  cwd    DIR   253,0     4096 3801089 /root
bacula-sd 5825 root  rtd    DIR   253,0     4096       2 /
bacula-sd 5825 root  txt    REG   253,0  2110599  368004 /usr/local/sbin/bacula-sd
bacula-sd 5825 root  mem    REG   253,0    75284  389867 /usr/lib/libz.so.1.2.3
bacula-sd 5825 root  mem    REG   253,0    46680 3604521 /lib/libnss_files-2.5.so
bacula-sd 5825 root  mem    REG   253,0   936908  369115 /usr/lib/libstdc++.so.6.0.8
bacula-sd 5825 root  mem    REG   253,0   125736 3606807 /lib/ld-2.5.so
bacula-sd 5825 root  mem    REG   253,0  1602128 3606885 /lib/libc-2.5.so
bacula-sd 5825 root  mem    REG   253,0   208352 3606892 /lib/libm-2.5.so
bacula-sd 5825 root  mem    REG   253,0   125744 3606887 /lib/libpthread-2.5.so
bacula-sd 5825 root  mem    REG   253,0    25940 3604573 /lib/libacl.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    15972 3604535 /lib/libattr.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    46548 3606908 /lib/libgcc_s-4.1.2-20080102.so.1
bacula-sd 5825 root  mem    REG   253,0 56422480  366368 /usr/lib/locale/locale-archive
bacula-sd 5825 root    0r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    1r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    2r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    3u   CHR   9,128             6469 /dev/nst0
bacula-sd 5825 root    4u  IPv4 1023380              TCP backup:bacula-sd (LISTEN)
bacula-sd 5825 root    5u  IPv4 2693268              TCP backup:bacula-sd->backup:53957 (CLOSE_WAIT)
bacula-sd 5825 root    7u  IPv4 3248683              TCP backup:bacula-sd->backup:57629 (CLOSE_WAIT)
bacula-sd 5825 root    8u  IPv4 3250966              TCP backup:bacula-sd->backup:37650 (CLOSE_WAIT)
bacula-sd 5825 root    9u  IPv4 3253908              TCP backup:bacula-sd->backup:37671 (CLOSE_WAIT)

คำตอบ:


18

วิธีเดียวที่คุณสามารถลบกระบวนการ zombie / defunct ได้คือการฆ่า parent เนื่องจากพาเรนต์เป็น init (pid 1) ซึ่งจะทำให้ระบบของคุณพัง

วิธีนี้จะทำให้คุณมีสองทางเลือก

  • ปรับเปลี่ยนตารางกระบวนการด้วยตนเองเช่น สร้างกระบวนการจำลองเชื่อมโยงกระบวนการที่หมดอายุเป็นลูกของจำลองแล้วฆ่าออก ค่อนข้างอันตรายและคุณอาจต้องล้างทรัพยากรกระบวนการอื่น ๆ ด้วยตนเองเช่นเซมาฟอร์และตัวจัดการไฟล์
  • รีบูทระบบ

ฉันจะไปกับที่สอง


2
+1 อย่างไรก็ตามไม่มีอะไรเร่งด่วนที่จะต้องทำอย่างใดอย่างหนึ่งตราบใดที่กระบวนการซอมบี้ไม่ปรากฏขึ้นอีกหรือกระบวนการซอมบี้ของคุณไม่ได้ล็อค 4G RAM ของคุณ :)
Kyle Smith

1
"เนื่องจาก parent เป็น init (pid 1) นั่นจะทำให้ระบบของคุณ" - คุณไม่สามารถฆ่าได้initเนื่องจากไม่มีตัวจัดการสัญญาณสำหรับ SIGKILL man 2 killดู
Cawflands

คุณจะทำอย่างไรก่อน
skerit

@ Andy ฉันไม่แน่ใจว่า SIGKILL ขึ้นอยู่กับตัวจัดการสัญญาณในกระบวนการเป้าหมาย แต่เป็นความจริงที่เคอร์เนลทั่วไปจะเพิกเฉยต่อ SIGKILL เพื่อเริ่มต้น อย่างไรก็ตามถ้าคุณใช้วิธีที่เย็นกว่านี้เพื่อกระตุ้นให้เกิดความตื่นตระหนกของเคอร์เนลฉันคิดว่าคุณจะพบว่าในระบบ Linux ส่วนใหญ่ SIGSEGV จะทำงานได้ค่อนข้างดี
Roy

1
ควรสังเกตว่างานอย่างใดอย่างหนึ่งinitคือการเก็บเกี่ยวกระบวนการซอมบี้ดังนั้นหากคุณรอนานพอควรinitล้างกระบวนการซอมบี้ แม้ว่าส่วนใหญ่initควรตั้งค่าตัวจัดการSIGCHLDที่จะSIG_IGN แก้ไขปัญหานี้
cyphar

3

คุณสามารถลองเริ่มต้น init ใหม่:

 # telinit u

มิฉะนั้นฉันจะไม่ต้องกังวลมากเกินไป มันไม่ทำงานและไม่ได้ใช้ทรัพยากรใด ๆ และมันอยู่ที่นั่นเพื่อให้เคอร์เนลสามารถจำได้


1
เอาล่ะฉันต้องกังวล มันเป็นเครื่องที่ใช้งานสำรอง (bacula) และบริการ voip (เครื่องหมายดอกจัน) ตราบใดที่กระบวนการ bacula-sd หมดอายุนั้นก็มี bacula ดูเหมือนจะไม่สามารถเข้าถึงเทปไดรฟ์ ...
andreas-h

ไม่ควรเปิดไฟล์ใด ๆ รัน lsof -p 5825 และตรวจสอบ
David Pashley

ดูเหมือนจะมีหลายสิ่งที่เปิด ... ดูด้านบน ความคิดใดที่ฉันสามารถทำได้ ฉันไม่เคยใช้ lsof ...
andreas-h

1
ใช่ซอมบี้ของคุณมี / dev / nst0 เปิด การรีระบบอาจเป็นทางออกที่ดีที่สุดในตอนนี้
Kyle Smith

5
ใช่รีบูตดูเหมือนจะเป็นคำตอบที่แพร่หลาย ฉันมักจะรู้สึกเหมือนฉันล้มเหลวเมื่อฉันต้องรีบูตเซิร์ฟเวอร์ :(
David Pashley

3

ตรวจสอบว่ามีความตื่นตระหนกของเคอร์เนลหรือไม่

# dmesg |tail

ตรวจสอบว่ากระบวนการอยู่ในโหมด "D" Unkillable sleep หรือไม่ซึ่งอยู่ในโหมดเคอร์เนลสำหรับ syscall บางตัวที่ยังไม่ได้ส่งคืน (เคอร์เนล oops หรือเหตุผลอื่น ๆ ) http://www.nabble.com/What-causes-an -unkillable กระบวนการ - td20645581.html


การจัดรูปแบบที่น่ารำคาญ
asdmin

จริงๆแล้วไม่มีความตื่นตระหนกของเคอร์เนล กระบวนการอยู่ในสถานะ 'Z' - ซอมบี้ ...
andreas-h

3

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


ฉันเห็นด้วยกับ init ไม่ทำงานอย่างถูกต้อง ดูเพิ่มเติม: และupstart systemd
Mikko Rantalainen

2

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

อย่าปล่อยให้กระบวนการซอมบี้กินสมองของคุณ เพียงไม่สนใจพวกเขา


11
ใช่นั่นคือทฤษฎี น่าเสียดายที่มันไม่จริงเสมอไป บางครั้งกระบวนการที่หมดอายุจะไปสู่ทรัพยากรระบบเช่น andreash มีการจัดทำเอกสารอย่างชัดเจน
รอย

5
ในกรณีของเขาตามผลลัพธ์ lsof กระบวนการซอมบี้กำลังกินสมองของ / dev / nst0 เขาต้องการสมองเหล่านั้นเพื่อดำเนินการสำรองข้อมูลต่อไป
Kyle Smith

2
ผู้ดูแลระบบที่ใช้อาชีพของเขา / เธอเพิกเฉยต่อกระบวนการซอมบี้ในที่สุดก็จะตื่นขึ้นมากลางดึกด้วยการถูกดูดออกจากพวกเขา ในประสบการณ์ของฉันซอมบี้บ่งบอกถึงสิ่งที่ผิด ฉันเขียนสิ่งเหล่านี้แม้ในขณะที่เด็กซอมบี้มีปฏิสัมพันธ์กับผู้ปกครองแปลก ๆ และผู้ปกครองกำลังหมุนซีพียูของฉัน ฉันไม่รู้ว่ามันเป็นความผิดของใคร แต่ประเด็นก็คือว่าซอมบี้น่าเกลียดและไม่สนใจพวกเขาวันหนึ่งจะมาหลอกหลอนคุณ ... หนึ่งวัน ... เมื่อคุณกำลังนอนหลับอย่างสงบสุข ... ในกลางดึก ... หลังจากวันที่ฤดูใบไม้ร่วงเย็น ...
Mike S

@ MikeS ฉันได้รับเสียงหัวเราะที่ดีจากความคิดเห็นของคุณ!
Paul Calabro

@MikeS มีสิทธิ์ ฉันมี ssh-agent defunct และ ssh หรือ git ไม่สามารถทำงานได้อย่างถูกต้อง รีสตาร์ทเท่านั้นที่สามารถช่วยได้ (แก้ไขแบบเดียวกับหน้าต่างมี ... ฮ่าฮ่า)
John Tribe

0

ดูเหมือนว่าคุณมีกระบวนการกำพร้า เท่าที่ฉันรู้วิธีเดียวที่จะฆ่าสิ่งเหล่านี้จะรีบูตกล่อง ฉันเคยเกิดเหตุการณ์นี้ขึ้นบนเซิร์ฟเวอร์ ESX ของฉัน (ซึ่งเป็น linux ภายใต้ประทุน) เป็นครั้งคราวและการรีบูตโฮสต์คือการแก้ไข (จากการสนับสนุน VMware)

ฉันเป็นคนที่แต่งตัวประหลาดที่ใช้ Windows เพื่อให้มันคุ้มค่า


น่าเสียดายที่การรีบูตเครื่องไม่ใช่ตัวเลือกจริง เป็นเครื่องที่ใช้บริการ voip ด้วยดังนั้นฉันไม่สามารถรีบูตในเวลาทำการ ...
andreas-h

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