Как найти все не отвечающие задачи из командной строки в Mac OS X?

Как найти все не отвечающие задачи из командной строки в Mac OS X?

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

https://github.com/cold-logic/killunresponsive

решение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+)

https://github.com/redanula/UnresponsiveCapture

Связанный контент