Есть ли что-то более сильное, чем «Force Quit»?


24

У меня есть приложение, которое не умрет: оно ушло из дока, но окно остается (с надувным мячом, если я наведу на него курсор мыши). Он не использует процессор, но я хочу, чтобы он ушел.

Есть ли что-то более сильное, чем «Force Quit», чтобы действительно убить приложение?


Я не уверен, что он сильнее, но попробуйте Приложения> Утилиты> Монитор активности. Найдите процесс и принудительно выйдите. Если это не сработает, запишите номер процесса, перейдите в терминал и введите «kill #», где # - номер процесса. HTH
— Дэвид ДельМонте

6
кнопка включения?
— Даниэль

1
@DanielLawson К сожалению, такие ситуации обычно приводят к этому.
— CajunLuke

1
Дэвид: Я предполагаю, что то, что Apple называет «Force Quit», одинаково, независимо от того, как вы к нему подходите, но я тоже пытался, но безрезультатно.
— Кен

Ответы:


14

Если вы знаете название приложения, вы можете проверить в Activity Monitor, чтобы увидеть, работает ли оно там еще, и попробовать принудительно завершить работу. Если это не сработает, запишите идентификатор процесса приложения (pid). Перейдите в терминал и наберите kill [pid], заменив «[pid]» на номер, который вы отметили ранее. Если это не сработает, попробуйте, kill -3 [pid]и если это не сработает kill -9 [pid]. Если процесс принадлежит другому пользователю (это, вероятно , нет), то , возможно , потребуется заменить killс sudo killи введите пароль.

Если приложение не отображается в Activity Monitor или вы не можете этого killсделать, возможно, окно застряло в другом месте, и приложение просто больше не работает. В этом случае иногда (не всегда) это может работать killall SystemUIServerили killall Dock.

Если ничего из этого не работает, вам придется выйти из системы и снова войти в нее или перезагрузиться. Несколько раз, когда я доходил до этого, приложение зависало так, что не давало возможности выйти из системы или завершить работу, поэтому мне пришлось сильно перезагрузиться.


Я попробовал все это (в том числе sudo, хотя процесс принадлежит мне), без изменений. Повлияет ли это killall SystemUIServerна любое из моих других открытых приложений, например, на забвение позиций в окне?
— Кен

2
gentmatt: Согласно kill -l, -3 - SIGQUIT, а -9 - SIGKILL («неуловимое, неуязвимое убийство»).
— Кен

1
@gentmatt 3 - это сигнал ВЫХОДА, который дает процессу возможность перехватить сигнал и выполнить очистку. 9 УБИЙ "не поддается ловле и не игнорируется". Есть куча других сигналов, которые вы можете отправить; запустить man kill(который входит в топ-10 лучших команд UNIX когда-либо), чтобы увидеть их все.
— CajunLuke

1
Я обычно просто убиваю -9. -3 не сильнее, чем "Force Quit"
— segfault

3
@BoTian True; Я прыгаю прямо к -9. Иногда я вообще не беспокоюсь о Force Quit. Но для пользователя, который не знает, что он делает, это может сработать и с меньшей вероятностью будет вредным. Это также не займет много времени, поэтому соотношение времени и ожидаемого результата не так уж и плохо.
— CajunLuke

7

Окно принудительного завершения 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) из Activity Monitor, сигнал обычно отображается как -9 (KILL).

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


Здесь есть некоторая полезная информация, но ни один из этих вариантов уничтожения процесса, похоже, никак не влияет на него.
— Кен

Если даже не SIGKILLработает, приложение, вероятно, находится в непрерывном сне , и вы действительно ничего не можете сделать (кроме перезагрузки).
— Blacklight Shining

Просто интересно, было ли это пользовательское приложение, такое как mail.app или pages.app, или это было каким-то образом, системный процесс, такой как Spotlight, или фоновый процесс приложения, такой как Plex (который мне трудно удалить).
— Дэвид ДельМонте

6

У меня были ситуации, когда Force Quit, Activity Monitor 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.