จะทำอย่างไรถ้า kill -9 ไม่ทำงาน?


8

ฉันมีกระบวนการที่น่ารำคาญ (ในกรณีนี้เป็นกระบวนการควั่นที่ควรจะทำงานใน iPhone Simulator (ตอนนี้หยุดยาว)

97442 ??         0:00.00 (MyProcess)

ฉันลองทุกอย่างที่ฉันสามารถคิดได้รวมถึง

sudo kill -9 97442
sudo kill -HUP 97442

และเช่นเดียวกับกา ... กระบวนการยังคงอยู่

ในกรณีนี้มันหมายถึงเพื่อที่จะทำงานต่อไปได้ฉันต้องรีบูตเครื่อง


ไม่ใช่คำถามการเขียนโปรแกรม - แต่ให้ดูกระบวนการซอมบี้
Adrian Cornish

มี xxxOverflow ที่ดีกว่าจากนั้น stackoverflow สำหรับคำถามประเภทนี้

ฉันโหวตให้กับ superuser- มันควรจะย้ายโดยอัตโนมัติ :-)
Adrian Cornish

1
ความอัปยศคือบริบทเป็นสิ่งที่ฉันเห็นใน X-Code 4 (ดูเหมือนว่าจะเกิดขึ้นขณะที่พยายามดีบักในเครื่องมือจำลอง) ซึ่งหมายความว่าคุณจะไม่สามารถทำงานต่อไปได้จนกว่าคุณจะรีบูตขณะพยายามเปิดแอปในเครื่องจำลองด้วย กระบวนการซอมบี้ดำรงอยู่ทำให้แอปของคุณหยุดทำงานทันทีที่เปิดตัว
BadPirate

เพียงแค่พยายามช่วยที่นี่ลองดูที่สคริปต์นี้มันช่วยให้ฉันสามารถฆ่ากระบวนการใด ๆ ที่มี "ชื่อ" ที่ได้ผลดีกว่า killall สำหรับฉันshellswissknife.blogspot.com/2013/03/killall.html
user36035

คำตอบ:


13

เมื่อกระบวนการยังคงอยู่ในตารางกระบวนการตามที่กระบวนการนี้มีอยู่คุณต้องฆ่ากระบวนการหลัก ก่อนอื่นให้ค้นหากระบวนการหลัก PID:

ps -eo 'pid,ppid,comm' | grep 97442

จากนั้นเรียกใช้kill <pid>เพื่อppidผลลัพธ์ที่ได้ (ให้โอกาสตายอย่างหมดจดก่อน)

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

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


อืมดูเหมือนว่ามันจะคุ้มค่าที่จะรายงานบั๊กกับ Apple หากคุณสามารถlaunchdล้มเหลวในการเก็บลูกที่ตายแล้ว OS X จะรีสตาร์ทlaunchdสำหรับคุณหรือไม่ถ้าคุณฆ่ามัน? (ให้แน่ใจว่าคุณไม่ได้มีเนื้อหาที่ไม่ได้บันทึกใด ๆ ที่สำคัญก่อนการทดสอบ.)
sarnold

อืม .. ในกรณีนี้กระบวนการพาเรนต์คือกระบวนการ launchd ซึ่งเป็นพาเรนต์ของ PID 1 - $ ps -eo 'ppid, comm' 97442 PPID COMM 155 (MyProcess) $ ps -eo 'ppid, comm' 155 PPID COMM 1 / sbin / launchd $ ps -eo 'ppid, comm' 1 PPID COMM 0 / sbin / launchd $ ps -eo 'ppid, comm' 0 PPID COMM
BadPirate

ใช่ลอง sudo kill -HUP บนกระบวนการ launchd และไม่ทำอะไรเลยโดยใช้กฎเดียวกันมองหาว่ามันเป็นผู้ปกครองและใช้เทคนิคเดียวกัน แต่ก็ยังไม่มีความสุข
BadPirate

ฉันคาดว่าlaunchdจะเพิกเฉยหรือบล็อกHUPสัญญาณ (ซึ่งเป็นสัญญาณของโมเด็ม hangupวันนี้มันยังใช้เมื่อsshทำการเชื่อมต่อที่ลดลงมิbash(1)ฉะนั้นเชลล์อื่น ๆ จะส่งHUPไปยังกระบวนการลูกที่เริ่มต้นเพราะมันไม่สามารถเกิดขึ้นได้สำหรับdaemons daemonsส่วนใหญ่จะไม่สนใจมันหรือใช้มันเพื่อส่งสัญญาณ ร้องขอไปอีกครั้งอ่านแฟ้มการกำหนดค่า.) ลองเพียงและหากที่ล้มเหลวkill $(pidof launchd) kill -KILL $(pidof launchd)
sarnold

1
อืมดังนั้นอาจ morphs นี้เป็นคำถาม launchctrl ... ฉันพยายามฆ่ากระบวนการ launchd แต่นั่นทำให้ระบบปฏิบัติการของฉันออกมา :) ซึ่งท้ายที่สุดก็อนุญาตให้ฉันกลับไปทำงานได้ (หลังจากรีสตาร์ท) ... อย่างไรก็ตามล่อในตัวฉัน ดูเหมือนว่าจะต้องมีวิธีการล้างกระบวนการโดยไม่จำเป็นต้องรีสตาร์ท: /
BadPirate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.