Files
clice/scripts/monitor-resources.sh

57 lines
1.7 KiB
Bash

#!/usr/bin/env bash
# Periodically logs disk and memory usage to a file.
# Usage: monitor-resources.sh [log-file]
set -uo pipefail
LOG_FILE="${1:-ci-resource-usage.log}"
INTERVAL="${CLICE_MONITOR_INTERVAL:-30}"
OS="$(uname -s)"
echo "Resource monitor started for ${OS}, interval ${INTERVAL}s, writing to ${LOG_FILE}" >> "${LOG_FILE}"
log_disk() {
echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] ===== Disk =====" >> "${LOG_FILE}"
df -h >> "${LOG_FILE}" 2>&1
}
log_mem() {
echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] ===== Memory =====" >> "${LOG_FILE}"
case "${OS}" in
Linux)
if command -v free >/dev/null 2>&1; then
free -h >> "${LOG_FILE}" 2>&1
else
cat /proc/meminfo >> "${LOG_FILE}" 2>&1
fi
;;
Darwin)
if command -v vm_stat >/dev/null 2>&1; then
PAGESIZE="$(sysctl -n hw.pagesize 2>/dev/null || echo 4096)"
TOTAL_MEM="$(sysctl -n hw.memsize 2>/dev/null || echo 0)"
echo "Total Memory: ${TOTAL_MEM} bytes" >> "${LOG_FILE}"
vm_stat >> "${LOG_FILE}" 2>&1
# Derive an approximate free/used breakdown to make the log easier to read.
FREE_PAGES="$(vm_stat | awk '/(Pages free|Pages speculative)/ {gsub(/\\./,\"\",$3); total+=$3} END {print total+0}')"
if [[ -n "${FREE_PAGES}" ]]; then
FREE_BYTES=$((FREE_PAGES * PAGESIZE))
echo "Approx Free: ${FREE_BYTES} bytes" >> "${LOG_FILE}"
fi
else
echo "vm_stat unavailable" >> "${LOG_FILE}"
fi
;;
*)
echo "Unsupported OS for memory logging: ${OS}" >> "${LOG_FILE}"
;;
esac
}
while true; do
log_disk
log_mem
echo "" >> "${LOG_FILE}"
sleep "${INTERVAL}"
done