Gibt es eine App, die mich benachrichtigt (im Benachrichtigungscenter), wenn ein Prozess für einen bestimmten Zeitraum einen hohen Prozentsatz an CPU verbraucht?

8

Neulich saß ich in einem Café und arbeitete, als ich nach unten schaute und feststellte, dass 25% meiner Batterie übrig waren.

Ich schaute auf meinen Aktivitätsmonitor und stellte fest, dass der Zeitmaschinenprozess für eine Weile zu 90% lief (solange ich ihn beobachtete).

Gibt es Apps, die mich benachrichtigen können, wenn sich ein Prozess für einen bestimmten Zeitraum auf einem bestimmten Level befindet?

Taylor Smith
quelle

Antworten:

6

Sie können ein solches Skript jede Minute mit cron oder launchd ausführen:

#!/bin/bash

cpulimit=50
prefix=${TMPDIR}cron_cpu
current=$(ps -erco %cpu,command | tail -n+2 | sed 's/^ *//')
echo "$current" > $prefix$(date +%s)
a=($prefix*); for ((i=0;i<=${#a[@]}-3;i++)); do rm "${a[i]}"; done
[[ $(awk '{s+=$1}END{printf "%i",s}' <<< "$current") -lt $cpulimit ]] && exit
averages=$(awk '{cpu=$1;sub(/[^ ]+ /,"");a[$0]+=cpu;c[$0]++}END{for(i in a){printf "%.1f %s\n",a[i]/c[$0],i}}' $prefix* | sort -rn)
if [[ $(awk '{s+=$1}END{printf "%i",s}' <<< "$averages") -ge $cpulimit ]]; then
    terminal-notifier -title "CPU use" -message "$(head -n5 <<< "$averages" | paste -sd / -)"
fi

Wenn die durchschnittliche CPU-Auslastung in den letzten drei Beispielen über 50% liegt, werden Terminal-Notifier verwendet , um die Prozesse anzuzeigen, die die meiste CPU verwendet haben.

Sie können auch MenuMeters verwenden , um die gesamte CPU- Auslastung in der Menüleiste anzuzeigen:

Oder führen Sie ein solches Skript mit GeekTool aus :

for i in {1..4}; do ps -erco %cpu,command | tail -n+2; sleep 1; done | sed 's/^ *//' | grep -v GeekTool | awk '{cpu=$1;sub(/[^ ]+ /,"");a[$0]+=cpu;c[$0]++}END{for(i in a){printf "%.1f %s\n",a[i]/c[$0],i}}' | sort -rn

Lri
quelle
0

Dies ist eine Variante, die aus der Antwort von @Lri aufgebaut ist. Es bleibt stumm, wenn keine Prozesse über einem Schwellenwert liegen (hier auf 60 eingestellt), führt jedoch keine Mittelwertbildung über die Abtastwerte durch und kann daher zu mehr einmaligem Rauschen führen. Wie bei der anderen Antwort müssen Sie Terminal-Notifier installieren .

Speichern Sie das folgende Skript in einer Datei (z. B. aufgerufen /Users/goldberg/cpu_notifyund ausführbar gemacht):

#!/bin/bash
# Post a notification if a process is over a CPU limit

# see ~/Library/LaunchAgents/goldberg.cpu_notify.plist

notify=/usr/local/bin/terminal-notifier

cpulimit=60
active=$(ps -erco %cpu,command \
    | head -3 \
    | grep -vE -e '\b(CPU COMMAND|bash|sed|awk|ps|grep|head)\b' \
    | awk "\$1 > $cpulimit")

# Skip if empty.
[ -z "${active}" ] || $notify  -title "CPU use" -message "$active"

Wenn Sie ein Protokoll darüber wünschen, wann bestimmte Prozesse überaktiv sind (ich muss zum Beispiel darauf ntpdachten), fügen Sie dem Skript eine Zeile wie die folgende hinzu:

echo "${active}" | grep -e SymDaemon -e ntpd | sed 's/^/'"$(date) "'/'  >> ~/tmp/symd-notes

... und launchdspeichern Sie die folgende Datei unter einem Namen wie ~/Library/LaunchAgents/goldberg.cpu_notify.plist. Verwenden Sie launchctl -wdiese Option, um die Liste zu identifizieren launchd(und um launchctl listzu überprüfen, ob sie vorhanden ist).

Dies ist auf ein Intervall von 300 Sekunden (5 Minuten) eingestellt, und Sie müssen die Zeile bearbeiten, die auf das Skript verweist.

<?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>Label</key>
    <string>goldberg.cpu_notify</string>
    <key>Program</key>
    <string>/Users/goldberg/bin/cpu_notify</string>
    <key>ServiceDescription</key>
    <string>High CPU process notification</string>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>ThrottleInterval</key>
    <integer>0</integer>
</dict>
</plist>

Hier erfahren Sie mehr über launchd und launchctl .

Joshua Goldberg
quelle