使用高CPU时通知。通过AppleScript还是Automator?

thi*_*aek 5 applescript automation automator cpu-usage

我想自动化,只要进程使用超过50%的CPU,
它就会向我的通知中心发送通知

我正在使用终端通知程序来发送低谷通知,
但是我对创建此自动化的最佳方法有些困惑。

我应该使用Automator.app还是创建自定义AppleScript?如果是,
如何使它始终处于打开状态?

mkl*_*nt0 5

如果这是为了交互式使用,让我建议一个实用的替代方案

  • 运行活动监视器
  • 按住 Control 键并单击其停靠栏图标。
  • 选择Dock Icon > Show CPU Usage- 或者,对于浮动窗口,选择Monitors > Show CPU Usage

您将获得当前 CPU 使用情况的每个核心显示 - 单击它将显示完整的“活动监视器”窗口,您可以在其中按 CPU 使用情况进行排序。


如果您确实需要自动化解决方案,我建议:

  • 编写一个bash脚本,用于top查找 CPU 百分比最高的任务,并terminal-notifier在高于阈值时调用 。
  • 将该脚本安排为launchd定期调用的任务

对于这种可能很频繁的后台活动来说,Automator 和 AppleScript 可能太重了。

即使运行top本身也会占用相当多的 CPU。


这是一个简单的 bash 脚本,大致可以完成您想要的操作:

#!/usr/bin/env bash

read pct name < <(top -l 2 -n 1 -F -o cpu -stats cpu,command | tail -1)
if (( ${pct%.*} >= 50 )); then
  /Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier \
    -message "Process > 50%: $name ($pct%)"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,这至少需要2 秒才能运行,因为必须收集 2 个样本(相隔 1 秒)才能计算 CPU 使用率百分比,因此在确定调用该命令的频率时请考虑这一点。

更新- 请参阅下面的分步实施说明。

参考:


实施自动化解决方案的分步说明:

  • 创建 bash 脚本
    • 创建纯文本文件~/watchcpu(即watchcpu主文件夹中的文件),将上述 bash 脚本粘贴到其中,然后保存。
  • 创建每用户启动代理以在登录时调用以及此后定期调用
    • 创建纯文本文件~/Library/LaunchAgents/WatchCPU.plist,将以下 XML 文档粘贴到其中,然后保存:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>WatchCPU</string>
    <key>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>-c</string>
        <string>. ~/watchcpu</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>15</integer>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
  • 加载每用户启动代理以激活它:
    • 在终端中运行以下命令(只需一次;从那时起,该文件将在每次登录时自动加载):
launchctl load ~/Library/LaunchAgents/WatchCPU.plist
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您可以自由选择自己的文件名和 bash 脚本的不同位置,但启动代理.plist文件必须驻留在其中~/Library/LaunchAgents,以便在登录时自动加载。
  • 间隔(key StartInterval)选择为15秒;同样,您可以自由地更改它,但请注意,选择更频繁的调用没有多大意义,因为launchd(调用启动代理的服务)会限制执行时间太接近调用间隔的代理;我不清楚细节,但在现有的解决方案中,10 秒的间隔会导致频繁的节流通知system.log(通过 Console.app 检查)。