Files
awoooi/scripts/reboot-recovery/macos-host-boot-readback.sh
2026-07-15 19:23:53 +08:00

119 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
export LC_ALL=C
boot_raw="$(sysctl -n kern.boottime)"
boot_epoch="$(printf '%s\n' "$boot_raw" | sed -E 's/^\{ sec = ([0-9]+),.*/\1/')"
if [[ ! "$boot_epoch" =~ ^[0-9]+$ ]]; then
echo "BLOCKER darwin_boot_epoch_unavailable"
exit 65
fi
now_epoch="$(date +%s)"
uptime_seconds=$((now_epoch - boot_epoch))
if (( uptime_seconds < 0 )); then
echo "BLOCKER darwin_uptime_invalid"
exit 65
fi
uid="$(id -u)"
launch_label="com.momo.ollama111-allow-proxy"
if launchctl print "gui/${uid}/${launch_label}" >/dev/null 2>&1; then
startup_enabled="enabled"
else
startup_enabled="unknown"
fi
if curl --max-time 2 -fsS http://127.0.0.1:11434/api/tags >/dev/null 2>&1; then
startup_active="active"
else
startup_active="inactive"
fi
logical_cores="$(sysctl -n hw.logicalcpu 2>/dev/null || true)"
load1="$(sysctl -n vm.loadavg 2>/dev/null | awk '{ print $2; exit }')"
mem_available_percent="$(memory_pressure -Q 2>/dev/null | awk -F': ' '
/System-wide memory free percentage/ {
value = $2
gsub(/%/, "", value)
print value
exit
}
')"
process_cpu_sum="$(ps -A -o %cpu= 2>/dev/null | awk '{ sum += $1 } END { printf "%.2f", sum + 0 }')"
cpu_host_percent="$(awk -v total="$process_cpu_sum" -v cores="$logical_cores" 'BEGIN {
if (cores <= 0) { exit 1 }
value = total / cores
if (value > 100) { value = 100 }
printf "%.2f", value
}')"
swap_total_mib="$(sysctl vm.swapusage 2>/dev/null | awk '{
for (i = 1; i <= NF; i += 1) {
if ($i == "total") {
value = $(i + 2)
gsub(/M/, "", value)
print value
exit
}
}
}')"
swap_used_mib="$(sysctl vm.swapusage 2>/dev/null | awk '{
for (i = 1; i <= NF; i += 1) {
if ($i == "used") {
value = $(i + 2)
gsub(/M/, "", value)
print value
exit
}
}
}')"
swap_used_percent="$(awk -v used="$swap_used_mib" -v total="$swap_total_mib" 'BEGIN {
if (total <= 0) { printf "0.00"; exit }
printf "%.2f", (used / total) * 100
}')"
disk_used_percent="$(df -Pk / 2>/dev/null | awk '
NR == 2 {
value = $5
gsub(/%/, "", value)
print value
exit
}
')"
if [[ ! "$logical_cores" =~ ^[0-9]+$ ]] || (( logical_cores < 1 )) ||
[[ ! "$load1" =~ ^[0-9]+([.][0-9]+)?$ ]] ||
[[ ! "$mem_available_percent" =~ ^[0-9]+([.][0-9]+)?$ ]] ||
[[ ! "$cpu_host_percent" =~ ^[0-9]+([.][0-9]+)?$ ]] ||
[[ ! "$swap_used_percent" =~ ^[0-9]+([.][0-9]+)?$ ]] ||
[[ ! "$disk_used_percent" =~ ^[0-9]+([.][0-9]+)?$ ]]; then
echo "BLOCKER darwin_perf_readback_unavailable"
exit 65
fi
printf 'boot_id=darwin_%s uptime_seconds=%s systemd_state=darwin_ssh startup_enabled=%s startup_active=%s\n' \
"$boot_epoch" "$uptime_seconds" "$startup_enabled" "$startup_active"
printf 'perf_schema=agent99_perf_readback_v1 os=darwin cores=%s load1=%s mem_available_percent=%s disk_used_percent=%s\n' \
"$logical_cores" "$load1" "$mem_available_percent" "$disk_used_percent"
printf 'darwin_pressure_schema=agent99_darwin_pressure_v1 cpu_host_percent=%s swap_used_percent=%s\n' \
"$cpu_host_percent" "$swap_used_percent"
ps -Ao pid=,ppid=,%cpu=,%mem=,rss=,comm= -r 2>/dev/null | awk '
NR <= 8 {
pid = $1
ppid = $2
cpu = $3
memory = $4
rss = $5
name = ""
for (i = 6; i <= NF; i += 1) {
name = name (name == "" ? "" : " ") $i
}
count = split(name, path, "/")
name = path[count]
gsub(/[^A-Za-z0-9._-]/, "_", name)
if (name == "") { name = "unknown" }
printf "darwin_process_sample_v1 pid=%s ppid=%s cpu_percent=%s memory_percent=%s rss_kib=%s name=%s\n", \
pid, ppid, cpu, memory, rss, name
}
'