ฉันมีแอพที่จะไม่ตาย: มันหายไปจากท่าเรือ แต่หน้าต่างยังคงอยู่ (มีลูกบอลชายหาดถ้าฉันเลื่อนเมาส์ไป) มันใช้ซีพียูไม่ได้ แต่ฉันอยากให้มันหายไป
มีบางอย่างที่แข็งแกร่งกว่า "Force Quit" เพื่อฆ่าแอปจริงๆหรือไม่?
ฉันมีแอพที่จะไม่ตาย: มันหายไปจากท่าเรือ แต่หน้าต่างยังคงอยู่ (มีลูกบอลชายหาดถ้าฉันเลื่อนเมาส์ไป) มันใช้ซีพียูไม่ได้ แต่ฉันอยากให้มันหายไป
มีบางอย่างที่แข็งแกร่งกว่า "Force Quit" เพื่อฆ่าแอปจริงๆหรือไม่?
คำตอบ:
หากคุณรู้ชื่อของแอพคุณสามารถเช็คอิน Activity Monitor เพื่อดูว่ามันยังทำงานอยู่หรือไม่และลองใช้ Force Quit หากไม่ได้ผลให้จด ID กระบวนการของแอป (pid) ไปที่เทอร์มินัลแล้วพิมพ์kill [pid]แทน "[pid]" ด้วยหมายเลขที่คุณจดบันทึกไว้ก่อนหน้านี้ หากไม่ได้ผลลองและถ้าไม่ได้ทำงานkill -3 [pid] kill -9 [pid]หากผู้ใช้รายอื่นเป็นเจ้าของกระบวนการนี้ (อาจไม่น่าเป็นไปได้) คุณอาจจำเป็นต้องแทนที่killด้วยsudo killและพิมพ์รหัสผ่านของคุณเมื่อได้รับแจ้ง
หากแอพไม่ปรากฏใน Activity Monitor หรือไม่สามารถทำได้killหน้าต่างอาจติดค้างอยู่ที่อื่นและแอปไม่ทำงานอีกต่อไป ในกรณีนี้บางครั้ง (ไม่เสมอไป) ก็สามารถทำงานไปหรือkillall SystemUIServerkillall Dock
หากไม่สามารถใช้งานได้คุณจะต้องออกจากระบบและย้อนกลับหรือรีบูต ไม่กี่ครั้งที่ฉันได้มาถึงจุดนี้แอปติดอยู่มันป้องกันการออกจากระบบหรือปิดดังนั้นฉันต้องรีบูตอย่างหนัก
sudoถึงแม้ว่ากระบวนการจะเป็นของฉัน) โดยไม่มีการเปลี่ยนแปลง จะkillall SystemUIServerมีผลกับแอพที่เปิดอยู่อื่น ๆ ของฉันเช่นลืมตำแหน่งหน้าต่าง
kill -l, -3 คือ SIGQUIT, และ -9 คือ SIGKILL ("การฆ่าที่ไม่สามารถจับได้, ไม่การเพิกเฉย")
man kill(ซึ่งเป็นคำสั่ง UNIX ที่ดีที่สุด 10 อันดับแรก) เพื่อดูทั้งหมด
หน้าต่างบังคับออกจากการkillallทำงานและการkillส่งสัญญาณทั้งหมดจะประมวลผลสัญญาณระยะ คุณสามารถใช้killall -killหากไม่ได้ผล
ยูทิลิตี้ killall ฆ่ากระบวนการที่เลือกตามชื่อซึ่งตรงข้ามกับการเลือกโดย pid เหมือนกับที่ทำโดย kill (1) โดยค่าเริ่มต้นมันจะส่งสัญญาณ TERM ไปยังกระบวนการทั้งหมดที่มี UID จริงเหมือนกับผู้เรียก killall ที่ตรงกับชื่อ procname ผู้ใช้ขั้นสูงได้รับอนุญาตให้ฆ่ากระบวนการใด ๆ
หากคุณเรียกใช้sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'และออกจากแอปพลิเคชันบางส่วนจากหน้าต่างบังคับออกจากปกติสัญญาณจะแสดงเป็น -15 (TERM) แต่เมื่อคุณออกจากกระบวนการพื้นหลัง (หรือแอปพลิเคชันที่ไม่ปรากฏใน Dock) จากการตรวจสอบกิจกรรมสัญญาณมักจะแสดงเป็น -9 (KILL)
SIGTERM เป็นสัญญาณเริ่มต้นที่ส่งไปยังกระบวนการโดยคำสั่ง kill หรือ killall มันทำให้เกิดการยกเลิกกระบวนการ แต่ต่างจากสัญญาณ SIGKILL มันสามารถจับและตีความ (หรือละเว้น) โดยกระบวนการ ดังนั้น SIGTERM จึงคล้ายกับขอให้กระบวนการยุติอย่างสวยงามช่วยให้สามารถล้างและปิดไฟล์ได้ ด้วยเหตุผลนี้สำหรับระบบ Unix หลายระบบในระหว่างการปิดระบบให้เริ่มต้น SIGTERM สำหรับกระบวนการทั้งหมดที่ไม่จำเป็นต้องปิดเครื่องรอสองสามวินาทีจากนั้นออก SIGKILL เพื่อบังคับให้ยุติกระบวนการใด ๆ ที่ยังคงมีอยู่
SIGKILLงานได้แอปอาจหยุดพักการทำงานชั่วคราวและไม่มีอะไรที่คุณสามารถทำได้จริง ๆ
ฉันเคยมีสถานการณ์ที่ Force Quit, Activity Monitor killและวิธีอื่น ๆ ใช้งานไม่ได้และ Mac ของฉันไม่สามารถปิดเครื่องได้เนื่องจากมัน
ในกรณีนี้การsudo shutdown -r nowทำงานเมื่อไม่มีอะไรจะทำได้และน่าจะดีกว่าการปิดเครื่องอย่างหนักผ่านปุ่มเปิดปิด
ในขณะที่คำตอบข้างต้นเป็นวิธีที่แข็งแกร่งที่จะยุติกระบวนการใด ๆ ที่เป็นเช่นSIGKILLkill -9 process_id
อย่างไรก็ตามกระบวนการที่มีอยู่สิ่งที่เป็นไปไม่ได้ที่จะมิได้Force Quit killพวกเขาเรียกว่าเป็นzombieกระบวนการ
นี่คือสคริปต์สั้น ๆ ที่จะสร้างzombieกระบวนการเป็นเวลาสองนาที:
perl -e 'if($p=fork) {print "unkillable pid:$p\n" ;system("ps -l"); sleep(120)}'
เรียกใช้สคริปต์ด้านบนในเทอร์มินัลแล้วคุณจะได้ผลลัพธ์เช่นนี้:
unkillable pid:50571
UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD
501 47380 47379 4006 0 31 0 2448416 2900 - S 0 ttys000 0:00.36 -bash
501 50570 47380 4006 0 31 0 2443512 1424 - S+ 0 ttys000 0:00.01 perl -e if($p=fork) {print "u
#THIS-> 501 50571 50570 2006 0 0 0 0 0 - Z+ 0 ttys000 0:00.00 (perl)
501 12795 12794 4006 0 31 0 2448296 1752 - S+ 0 ttys001 0:00.75 -bash
501 50123 50122 4006 0 31 0 2448296 2688 - S+ 0 ttys002 0:00.14 -bash
หากคุณตรวจสอบคอลัมน์สถานะของกระบวนการ unkillable (ในกรณีนี้: 50571) คุณเห็นธงคืออะไรหมายถึงZzombie
คุณสามารถลองส่งkillสัญญาณใด ๆ(เช่นkill -9 50571) และกระบวนการจะยังคงอยู่ อย่างไรก็ตามมันไม่ได้ทำให้ระบบของคุณเจ็บปวดมากนักเพราะจริงๆแล้วมันไม่มีอยู่จริง - เพียงแค่ใช้ตารางกระบวนการเท่านั้น
ในตัวอย่างด้านบนใน 120 วินาทีมันจะถูกล้าง
นี่คือสิ่งที่คุณควรทำ:
กระบวนการเช่นนี้จะถูกลบออกได้ดีที่สุดในเซฟโหมดหากคุณกำลังพยายามถอนการติดตั้ง
ไชโยไบรอัน