57 lines
1.7 KiB
Bash
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
|