Я знаю, что могу сделать ps -aux | xargs kill
т.д., но я хочу перечислить PID всех задач, которые не отвечают (красные в Activity Monitor). Какую команду я могу выполнить в терминале, чтобы перечислить эти красные неотвечающие задачи и автоматически завершить их.
3 ответа
Кто-то уже задавал почти такой же вопрос в разделе Как я могу определить, что приложение не отвечает? (определить, какие процессы не отвечают, является трудной частью, убить их довольно легко). Я процитировал соответствующий ответ здесь:
Состояние 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]
.
Немного опоздал на вечеринку, но я написал терминальное приложение, которое сделает это за вас. Он обходит необходимость сценариев пользовательского интерфейса в мониторе активности и вместо этого использует отчет spindump для определения не отвечающих процессов и автоматически завершает их для вас.
Это вызывает у меня проблемы с моими блоками 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 зависнуть, поэтому я смог использовать его в качестве теста. Пусть это поможет будущему - мне или кому-то еще!