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 ボックスで、時々何かがシステムを詰まらせているようなので困っています。問題の詳細をもっと詳しく知ることができるように。試してみます。spindump を使用するというアイデアをくれた @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/UnresponsiveCapture

関連情報