
Eu sei que posso fazer ps -aux | xargs kill
etc, mas quero listar os PIDs de todas as tarefas que não estão respondendo (os vermelhos no Activity Monitor). Qual comando posso executar no terminal para listar essas tarefas vermelhas que não respondem e encerrá-las automaticamente.
Responder1
Alguém já fez praticamente a mesma pergunta emComo posso determinar se um aplicativo não está respondendo?(determinar quais processos não estão respondendo é a parte difícil, eliminá-los é bastante fácil). Citei uma resposta relevante aqui:
O estado Não respondendo não é um estado de processo, mas sim o processo parou de se comunicar com o gerenciador de janelas/mecanismo gráfico. Ele pode estar amarrado em um loop, pendurado em um soquete, arquivo remoto, qualquer coisa que o mantenha retornando ao loop principal que trata dos eventos. O gerenciador de janelas percebe que os eventos estão sendo enfileirados e, portanto, rotula-os como "Não está respondendo"
Talvez seja necessário escrever um pequeno programa X11 que envie eventos fictícios para o processo e, em seguida, eliminá-lo se ele não responder.
Portanto, não é exatamente possível determinar quais programas não estão respondendo, pelo menos não sem recorrer fortemente à lógica AppleScript/X11.
Se você estiver curioso, este pequeno trecho de AppleScript (feito para Mavericks, provavelmente não funcionará em mais nada) também foi postado no tópico vinculado e basicamente identifica todos os programas que não respondem e então envia um KILL
sinal para eles:
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
No entanto, se você identificou um aplicativo que está funcionando mal, você pode eliminar todas as instâncias dele com sudo killall [AppName]
, por exemplo sudo killall "Activity Monitor"
, . Você pode identificar o PID de aplicativos individuais com pgrep [AppName]
, por exemplo pgrep "Google Chrome"
, e pode eliminar qualquer um dos PIDs resultantes com kill [PID]
.
Responder2
Um pouco atrasado para a festa, mas escrevi um aplicativo de terminal que fará isso para você. Ele ignora a necessidade de scripts de interface do usuário do Activity Monitor e, em vez disso, usa um relatório spindump para determinar os processos que não respondem e encerrá-los automaticamente para você.
Responder3
Isso está me incomodando em minhas caixas Jenkins OSX, onde parece que algo obstrui meus sistemas de vez em quando. Para poder obter melhores detalhes sobre quaisquer problemas. Vou tentar isso, hattip @coldlogic pela ideia de usar 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
Hoje consegui reproduzir, fazendo com que as preferências do Sys travassem, então pude usá-lo como um teste. Que isso ajude o futuro, eu ou outra pessoa!
Responder4
Obrigado pelo coldlogic. Eu escrevi um aplicativo de terminal para eliminar processos que não respondem no macOS. (Rápido, funciona bem em 10.12+)