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

7
我希望能够自动化处理,每当一个进程使用超过50%的CPU时,它会向我的通知中心发送一条通知。
我正在使用terminal-notifier来发送通知,但是我不确定最佳方法是使用Automator.app还是创建一个自定义的AppleScript,如果使用后者,如何让它始终处于开启状态?

2个回答

5
如果这是用于交互式使用的,让我建议一个实用的替代方案:
  • 运行 活动监视器
  • 控制单击其 Dock 图标。
  • 选择 Dock 图标 > 显示 CPU 使用情况 - 或者,对于浮动窗口,选择 监视器 > 显示 CPU 使用情况

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


如果您确实需要一种自动化解决方案,我建议:
编写一个使用top查找最高CPU百分比任务并在超过阈值时调用terminal-notifier的bash脚本。
安排该脚本作为定期调用的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

请注意,这需要至少2秒钟才能运行,因为必须收集2个样本(相隔1秒)来计算CPU使用率百分比,因此在确定多频繁调用命令时要考虑这一点。
更新-有关逐步实施说明,请参见下文。
参考:
- 至于安排脚本以使 launchd 在登录时运行:请参见https://dev59.com/qmAh5IYBdhLWcg3wE_7v#22872222 - launchd *.plist文件的一般格式在https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html man launchd.plist 中描述; StartInterval 是指定每N秒调用的关键。

实现自动化解决方案的逐步说明:

  • 创建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>
  • 加载每个用户的启动代理以激活它:
    • 在终端中运行以下命令(仅需要一次;从那时起,文件将在每次登录时自动加载):
launchctl load ~/Library/LaunchAgents/WatchCPU.plist

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

这对我来说比上面的选项更有效。创建了一个新的Automator应用程序并使其运行shell脚本,然后将其添加到登录项中。谢谢。 - thibmaek
@Thibmaekelbergh:很高兴听到这个消息。你是如何实现“定期”调用的?你只是在bash脚本中放了一个循环吗? - mklement0
1
@Thibmaekelbergh:因为我很好奇,所以我实现了bash脚本/launchd(每个用户的启动代理)解决方案-请查看我的更新,其中包含逐步说明。 - mklement0
谢谢!我创建的自动化流程仍然存在一些问题,我会看看你的流程如何处理。 - thibmaek

0

您可以轻松地使用脚本或自动化工作流程来获取CPU使用率。以下是一个脚本,您可以安排定期运行,并在使用率超过50%时通知:

set theDelay to 3 -- number of seconds to sample the CPU
set CPUusage to do shell script "top -F -l " & theDelay & " -n 1 -stats cpu | grep 'CPU usage:' | tail -1 | cut -d. -f1"
set idlePercent to word -2 of CPUusage as number
if idlePercent < 50 then display notification ("CPU usage is at " & (100 - idlePercent) & "%.") with title "CPU Usage"

请查看注释以跟踪编辑 do shell script 命令,以允许从 shell 命令中自然获取整数,并更好地与非英语系统配合使用。

谢谢,但似乎没有起作用。我通过运行yes > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null &来对我的CPU进行了压力测试,但出现了以下错误:_error ""44.22"无法转换为数字类型。"number -1700 from "44.22" to number - thibmaek
你是否使用的是非英语系统。你可以添加一个明确的数字强制转换,这可能会解决问题。我已经添加了它。你可能需要不同的方法来获取空闲百分比数字,但这很容易弄清楚。顺便说一下,为了测试,只需将<更改为>。你不必加载系统。如果你需要帮助解析数字,请捕获CPU使用率字符串并在此处发布。 - jweaks
1
你正在解决一个不同的问题,即确定整体CPU使用百分比,而@Thibmaekelbergh - 根据我阅读的问题 - 正在寻找当单个进程使用超过50%的CPU时。 - mklement0
在OSX文件系统中,将grep作为GREP调用是有效的,但我建议使用实际可执行文件名中的大小写,即grep(只是为了养成更具可移植性的习惯)。 - mklement0
1
好的观点,mklement。我改变了grep。现在我看到了单个CPU与整体CPU之间的区别。只需要调整使用的行从顶部开始,类似于您所做的。如果他对bash脚本感到满意,我也很高兴。 - jweaks
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接