在 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 pgrep [AppName],例如pgrep "Google Chrome",并且可以使用 终止任何生成的 PID kill [PID]

答案2

虽然有点晚了,但我已经编写了一个终端应用程序来为您完成此操作。它绕过了对活动监视器进行 UI 脚本编写的需要,而是使用 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。我编写了一个终端应用程序来终止 macos 上无响应的进程。(swift,在 10.12+ 上运行良好)

https://github.com/redanula/UnresponsiveCapture

相关内容