
Я знаю, что могу сделать ps -aux | xargs kill
и т. д., но я хочу вывести список PID всех задач, которые не отвечают (красные в Activity Monitor). Какую команду я могу выполнить в терминале, чтобы вывести список этих красных, не отвечающих задач и автоматически завершить их.
решение1
Кто-то уже задавал примерно такой же вопрос наКак определить, что приложение не отвечает?(Определить, какие процессы не отвечают, — сложная часть, завершить их довольно просто). Я процитировал соответствующий ответ здесь:
Состояние «Не отвечает» не является состоянием процесса, а скорее процесс прекратил взаимодействие с оконным менеджером/графическим движком. Он может быть связан в цикле, зависнуть на сокете, удаленном файле, чем угодно, что заставляет его возвращаться в основной цикл, который обрабатывает события. Оконный менеджер замечает, что события ставятся в очередь, и поэтому помечает его как «Не отвечает»
Возможно, вам придется написать небольшую программу X11, которая отправляет фиктивные события процессу, а затем завершает его, если он не отвечает.
Таким образом, невозможно точно определить, какие именно программы не отвечают, по крайней мере, без активного использования логики AppleScript/X11.
Если вам интересно, этот небольшой фрагмент AppleScript (создан для Mavericks и, вероятно, не будет работать ни на чем другом) также был опубликован в связанной ветке и, по сути, определяет все неотвечающие программы, а затем отправляет KILL
им сигнал:
tell application "Activity Monitor" to run --We need to run Activity Monitor
tell application "System Events" to tell process "Activity Monitor"
tell radio button 1 of radio group 1 of group 1 of toolbar 1 of window 1 to click --Using the CPU View
tell outline 1 of scroll area 1 of window 1 -- working with the list
set notResponding to rows whose value of first static text contains "Not Responding" -- Looking for Not responding process
repeat with aProcess in notResponding
set pid to value of text field 5 of aProcess -- For each non responding process retrieve the PID
if pid is not "" then do shell script ("kill -9 " & pid) -- KILL the PID.
end repeat
end tell
end tell
Однако если вы определили приложение, которое ведет себя некорректно, вы можете завершить все его экземпляры с помощью sudo killall [AppName]
, например sudo killall "Activity Monitor"
. Вы можете определить PID отдельных приложений с помощью pgrep [AppName]
, например pgrep "Google Chrome"
, и вы можете завершить любой из полученных PID с помощью kill [PID]
.
решение2
Немного опоздал на вечеринку, но я написал терминальное приложение, которое сделает это за вас. Оно обходит необходимость в скриптах пользовательского интерфейса Activity Monitor и вместо этого использует отчет spindump для определения неотвечающих процессов и автоматически завершает их для вас.
решение3
Это беспокоит меня на моих ящиках Jenkins OSX, где, кажется, что-то время от времени засоряет мои системы. Чтобы иметь возможность получить более подробную информацию о любых проблемах. Я попробую это, подсказка @coldlogic за идею использовать spindump!
$ sudo spindump -notarget 5 -timelimit 60 -stdout -noFile -noProcessingWhileSampling -aggregateStacksByProcess | grep -B 8 "Unresponsive for"
Sampling all processes for 5 seconds with 10 milliseconds of run time between samples
Sampling completed, processing symbols...
Process: System Preferences [31152]
Path: /Applications/System Preferences.app/Contents/MacOS/System Preferences
Architecture: x86_64
Parent: launchd [1]
UID: 982457465
Task size: 38.81 MB (-20 KB)
CPU Time: <0.001s (263.8K cycles, 65.8K instructions, 4.01c/i)
Note: Unresponsive for 2258 seconds before sampling
Сегодня мне удалось воспроизвести ошибку, которая привела к зависанию Sys prefs, поэтому я смог использовать ее в качестве теста. Пусть это поможет мне в будущем или кому-то еще!
решение4
Спасибо за coldlogic. Я написал терминальное приложение для завершения неотвечающих процессов на Mac. (Swift, отлично работает в 10.12+)