Чи є щось сильніше, ніж "Сила кинути"?


24

У мене є додаток, який не помре: воно пішло з лави підсудних, але вікно залишається (з пляжним кулем, якщо я клацніть на ньому курсором миші). Він не використовує процесор, але я хочу, щоб він пройшов.

Чи є щось сильніше, ніж "Примусово кинути", щоб дійсно вбити програму?


Я не впевнений, чи він міцніший, але спробуйте Служби> Утиліти> Монітор активності. Знайдіть процес і примусово киньте роботу. Якщо це не працює, відзначте номер процесу, перейдіть до терміналу і введіть "kill #", де # - номер процесу. HTH
David DelMonte

6
кнопка живлення?
Даниїл

1
@DanielLawson На жаль, такі ситуації зазвичай призводять до цього.
CajunLuke

1
Девід: Я припускаю, що те, що Apple називає "Force Quit", те саме, незалежно від того, як ви дістанетесь до нього, але я також спробував це, без ефекту.
Кен

Відповіді:


14

Якщо ви знаєте назву програми, ви можете завітати в «Монітор активності», щоб перевірити, чи все ще він працює там, і спробувати його Force Quit. Якщо це не працює, врахуйте ідентифікатор процесу програми (pid). Перейдіть до терміналу та введіть kill [pid], замінивши "[pid]" номером, який ви зазначили раніше. Якщо це не працює, спробуйте, kill -3 [pid]а якщо це не працює kill -9 [pid]. Якщо процес належить іншому користувачеві (це, ймовірно , немає), то , можливо , буде потрібно замінити killз sudo killі введіть пароль.

Якщо додаток не відображається в "Моніторі діяльності", або ви цього не могли kill, це вікно може залишитися десь іншим, і програма просто більше не працює. У цьому випадку іноді (не завжди) це може спрацювати killall SystemUIServerабо killall Dock.

Якщо нічого з цього не працює, вам доведеться вийти з системи та знову увійти або перезавантажитись. Кілька разів я потрапив до цього моменту, додаток було настільки застряг, що заважало виходити з системи чи вимикатись, тому мені довелося важко перезавантажитись.


Я спробував усе це (в тому числі sudo, навіть якщо процес належить мені), без змін. Чи killall SystemUIServerвплине це на будь-які інші мої відкриті програми, наприклад, забуття позицій вікон?
Кен

2
gentmatt: Відповідно до kill -l-3 є SIGQUIT, а -9 - SIGKILL ("невловимий, неігнорований вбивство").
Кен

1
@gentmatt 3 - сигнал QUIT, який дає процесу можливість перехоплювати сигнал та виконувати очищення. 9 є KILL - це "непридатний до уваги і не ігнорується". Є купа інших сигналів, які ви можете надсилати; запустіть man kill(який входить в топ-10 найкращих команд UNIX коли-небудь), щоб побачити їх усіх.
CajunLuke

1
Я зазвичай просто вбиваю -9. -3 не сильніший за "Сила кинути"
segfault

3
@BoTian True; Я пропускаю прямо до -9. Іноді я взагалі не турбуюсь про Force Quit. Але для користувача, який не знає, що вони роблять, це може спрацювати і менше шансів нанести шкоду. Це також не займе багато часу, тому час, витрачений на очікуваний результат, не все так погано.
CajunLuke

7

Вікно виходу з сили killall, і killвсі відправляють обробляють сигнали TERM за замовчуванням. Ви можете використовувати, killall -killякщо це не працює.

Утиліта killall вбиває процеси, вибрані по імені, на відміну від вибору pid, як це зроблено за допомогою kill (1). За замовчуванням він надсилатиме сигнал TERM всім процесам з реальним UID, ідентичним виклику killall, що відповідає імені proname. Суперкористувач може вбити будь-який процес.

Якщо запустити sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'та закрити якусь програму з вікна виходу з сили, сигнал зазвичай відображається як -15 (TERM). Але коли ви закриваєте фоновий процес (або програму, яка не відображається в док-станції) з "Монітора активності", сигнал зазвичай відображається як -9 (Вбивство).

SIGTERM - сигнал за замовчуванням, що надсилається процесу командами kill або killall. Це спричиняє припинення процесу, але на відміну від сигналу SIGKILL, його можна вловлювати та інтерпретувати (або ігнорувати) процесом. Таким чином, SIGTERM схожий на те, щоб попросити процес добре закінчитися, що дозволяє очистити та закрити файли. З цієї причини, у багатьох системах Unix під час відключення init видає SIGTERM всім процесам, які не мають важливого значення для вимкнення, зачекає кілька секунд, а потім видає SIGKILL для примусового припинення будь-яких таких процесів, що залишилися.


Тут є якась добра інформація, але жоден із цих варіантів вбивства процесу, здається, не впливає на нього.
Кен

Якщо це навіть не SIGKILLпрацює, програма, ймовірно, перебуває у режимі безперебійного сну , і ви дійсно нічого не можете зробити (окрім перезавантаження).
Blacklight Shining

Просто цікаво, чи це був користувальницький додаток, наприклад, mail.app або pages.app, чи це якимось чином, системний процес, як Spotlight, або фоновий процес програми, наприклад, Plex (що я маю проблеми з видаленням).
Девід ДельМонте

6

У мене були ситуації, коли Force Quit, Монітор активності killта інші методи не працювали, і мій Mac не міг відключитися через це.

У цьому випадку sudo shutdown -r nowспрацьовує, коли нічого іншого не буде, і, мабуть, краще, ніж робити жорстке відключення за допомогою кнопки живлення.


1

Як і у наведених вище відповідях, найсильнішим способом припинення будь-якого процесу є 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

Якщо ви перевіряєте стовпчик статусу для процесу, який не можна скасувати (у даному випадку: 50571), ви бачите Zпрапор, що означає zombie.

Ви можете спробувати надіслати будь-який killсигнал (наприклад kill -9 50571), і процес все ще буде існувати. У будь-якому випадку це не сильно шкодить вашій системі, оскільки насправді її немає - займає лише таблицю процесів.

У наведеному вище прикладі через 120 секунд він очиститься.


0

Ось що ви повинні зробити:

  1. У Моніторі активності двічі клацніть процес АБО Клацніть піктограму Інформація, щоб відкрити вікно процесу.
  2. Ви побачите процес # у рядку групи процесів як processName (####), де "####" - номер вашого процесу.
  3. Відкрийте термінал і введіть "sudo kill ####" без лапок і натисніть клавішу Enter
  4. Введіть свій пароль, термінал не відображатиметься тут
  5. Процес вбивається.

Такий процес найкраще видалити в безпечному режимі, якщо ви збираєтесь спробувати видалити.

Ура, Брайан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.