Mac OS X의 명령줄에서 응답하지 않는 모든 작업을 찾으시나요?

Mac OS X의 명령줄에서 응답하지 않는 모든 작업을 찾으시나요?

나는 할 수 있다는 ps -aux | xargs kill것을 알고 있지만 응답하지 않는 모든 작업의 ​​PID를 나열하고 싶습니다(활동 모니터의 빨간색). 빨간색의 응답하지 않는 작업을 나열하고 자동 종료하기 위해 터미널에서 실행할 수 있는 명령은 무엇입니까?

답변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를 식별할 수 있으며 를 사용하여 결과 PID를 모두 삭제할 수 있습니다 .pgrep [AppName]pgrep "Google Chrome"kill [PID]

답변2

파티에 조금 늦었지만 여러분을 위해 이 작업을 수행할 터미널 애플리케이션을 작성했습니다. Activity Monitor의 UI 스크립팅 필요성을 무시하고 대신 스핀 덤프 보고서를 사용하여 응답하지 않는 프로세스를 확인하고 자동으로 종료합니다.

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

답변3

때때로 내 시스템을 막히게 하는 무언가가 있는 것처럼 보이는 Jenkins OSX 상자에서 나를 괴롭히고 있습니다. 모든 문제에 대해 더 나은 세부 정보를 얻을 수 있습니다. 스핀 덤프를 사용하는 아이디어에 대해 hattip @coldlogic을 시도해 보겠습니다!

    $ 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에 감사드립니다. macos에서 응답하지 않는 프로세스를 종료하는 터미널 애플리케이션을 작성했습니다.(swift, 10.12+에서는 잘 작동함)

https://github.com/redanula/UnResponseCapture

관련 정보