#!/bin/zsh [ -e "${HOME}/.mwrc" ] && . "${HOME}/.mwrc" FIRST_NOTIFIED=0 SECOND_NOTIFIED=0 while true; do # Stored in kB STR=$(grep "MemAvailable" /proc/meminfo) STR_RIGHT="${STR#* }" STR_FINAL="${STR_RIGHT% *}" AVAIL_GB=$((STR_FINAL / (1024.0 * 1024.0))); AVAIL_PRETTY=$(printf "%.1f" "${AVAIL_GB}"); PCT=$((AVAIL_GB / 32.0)); PERCENT_USE=$(((1.0 - PCT) * 100.0)); PCT_PRETTY=$(printf "%.1f" "${PERCENT_USE}"); if [ $STR_FINAL -gt $MINIMUM_AVAILABLE_MEMORY ]; then if [ $SECOND_NOTIFIED -eq 1 ]; then sleep 10; else [ $FIRST_NOTIFIED -eq 1 ] && sleep 15; fi if [ $STR_FINAL -gt $((MINIMUM_AVAILABLE_MEMORY * 3)) ]; then # echo $(date +'%Y-%m-%d %H:%M:%S') - "bigger than 3x" # Available RAM at > 3x minimum FIRST_NOTIFIED=0 SECOND_NOTIFIED=0 sleep 5; continue; else FIRST_NOTIFIED=1 [ $STR_FINAL -gt $((MINIMUM_AVAILABLE_MEMORY * 2)) ] || SECOND_NOTIFIED=1; fi if [ $SECOND_NOTIFIED -eq 1 ]; then # < 2x minimum remaining echo $(date +'%Y-%m-%d %H:%M:%S') - "less than 2x" notify-send \ --urgency=normal \ -i "info" \ "LOW MEMORY" \ "${AVAIL_PRETTY}GB available (${PCT_PRETTY}% used)"; play -q -v 0.50 "${NOTIFICATION_SOUND_PATH}"; play -q -v 0.75 "${NOTIFICATION_SOUND_PATH}"; sleep 8; else # Available RAM at > 2x minimum # echo $(date +'%Y-%m-%d %H:%M:%S') - "bigger than 2x" SECOND_NOTIFIED=0 if [ $FIRST_NOTIFIED -eq 1 ]; then # ... but < 3x minimum echo $(date +'%Y-%m-%d %H:%M:%S') - "less than 3x" notify-send \ --urgency=low \ -i "computer-fail" \ "Memory usage increased" \ "${AVAIL_PRETTY}GB available (${PCT_PRETTY}% used)"; # play -q -v 0.025 "${NOTIFICATION_SOUND_PATH}"; sleep 40; else FIRST_NOTIFIED=0 continue; fi fi sleep 3; else FIRST_NOTIFIED=0 SECOND_NOTIFIED=0 echo $(date +'%Y-%m-%d %H:%M:%S') - "less than 1x" >&2 echo $(date +'%Y-%m-%d %H:%M:%S') - "[CRASH IMMENENT] ${AVAIL_PRETTY}GB available (${PCT_PRETTY}% used)"; notify-send \ --urgency=critical \ -i "error" \ "LOW MEMORY, CRASH IMMENENT" \ "${AVAIL_PRETTY}GB available (${PCT_PRETTY}% used)"; play -q -v 1.0 "${NOTIFICATION_SOUND_PATH}"; play -q -v 1.0 "${NOTIFICATION_SOUND_PATH}"; play -q -v 1.0 "${NOTIFICATION_SOUND_PATH}"; play -q -v 1.0 "${NOTIFICATION_SOUND_PATH}"; play -q -v 1.0 "${NOTIFICATION_SOUND_PATH}"; sleep 6; fi done