ฉันมีแอพที่จะไม่ตาย: มันหายไปจากท่าเรือ แต่หน้าต่างยังคงอยู่ (มีลูกบอลชายหาดถ้าฉันเลื่อนเมาส์ไป) มันใช้ซีพียูไม่ได้ แต่ฉันอยากให้มันหายไป
มีบางอย่างที่แข็งแกร่งกว่า "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 SystemUIServer
killall 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
ทำงานเมื่อไม่มีอะไรจะทำได้และน่าจะดีกว่าการปิดเครื่องอย่างหนักผ่านปุ่มเปิดปิด
ในขณะที่คำตอบข้างต้นเป็นวิธีที่แข็งแกร่งที่จะยุติกระบวนการใด ๆ ที่เป็นเช่นSIGKILL
kill -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) คุณเห็นธงคืออะไรหมายถึงZ
zombie
คุณสามารถลองส่งkill
สัญญาณใด ๆ(เช่นkill -9 50571
) และกระบวนการจะยังคงอยู่ อย่างไรก็ตามมันไม่ได้ทำให้ระบบของคุณเจ็บปวดมากนักเพราะจริงๆแล้วมันไม่มีอยู่จริง - เพียงแค่ใช้ตารางกระบวนการเท่านั้น
ในตัวอย่างด้านบนใน 120 วินาทีมันจะถูกล้าง
นี่คือสิ่งที่คุณควรทำ:
กระบวนการเช่นนี้จะถูกลบออกได้ดีที่สุดในเซฟโหมดหากคุณกำลังพยายามถอนการติดตั้ง
ไชโยไบรอัน