Есть ли что-то более сильное, чем «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.

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

CajunLuke
источник
Я попробовал все это (в том числе 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 для принудительного завершения любых таких процессов, которые остаются.

LRI
источник
Здесь есть некоторая полезная информация, но ни один из этих вариантов уничтожения процесса, похоже, никак не влияет на него.
Кен
Если даже не 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 секунд он будет очищен.

jm666
источник
0

Вот что вы должны сделать:

  1. В Мониторе активности дважды щелкните по процессу ИЛИ Нажмите значок «Информация», чтобы открыть окно процесса.
  2. Вы увидите процесс № в строке «Группа процессов» как processName (####), где «####» - это номер вашего процесса.
  3. Откройте терминал и введите «sudo kill ####» без кавычек и нажмите Enter
  4. Введите ваш пароль, терминал не будет показывать ваш ввод здесь
  5. Процесс убит.

Подобный процесс лучше всего удалять в безопасном режиме, если вы попытаетесь удалить его.

Ура, Брайан

Брок Вонд
источник