5

Я знаю, что могу сделать ps -aux | xargs kill т.д., но я хочу перечислить PID всех задач, которые не отвечают (красные в Activity Monitor). Какую команду я могу выполнить в терминале, чтобы перечислить эти красные неотвечающие задачи и автоматически завершить их.

3 ответа3

4

Кто-то уже задавал почти такой же вопрос в разделе Как я могу определить, что приложение не отвечает? (определить, какие процессы не отвечают, является трудной частью, убить их довольно легко). Я процитировал соответствующий ответ здесь:

Состояние Not Responding - это не состояние процесса, а процесс прекратил связь с оконным менеджером / графическим ядром. Это может быть связано в цикле, висящем на сокете, удаленном файле, чем угодно, что заставляет его возвращаться в основной цикл, который обрабатывает события. Оконный менеджер замечает, что события находятся в очереди, и поэтому помечает его как "Не отвечающий".

Вам может потребоваться написать небольшую программу 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] .

1

Немного опоздал на вечеринку, но я написал терминальное приложение, которое сделает это за вас. Он обходит необходимость сценариев пользовательского интерфейса в мониторе активности и вместо этого использует отчет spindump для определения не отвечающих процессов и автоматически завершает их для вас.

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

0

Это вызывает у меня проблемы с моими блоками 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 зависнуть, поэтому я смог использовать его в качестве теста. Пусть это поможет будущему - мне или кому-то еще!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .