#!/bin/bash

declare -A PPIDMAP
declare -A COMMMAP
declare -A RSSMAP
declare -A STATEMAP
declare -A ARGSMAP

while read -r pid ppid state rss comm args; do
    PPIDMAP[$pid]=$ppid
    STATEMAP[$pid]=$state
    RSSMAP[$pid]=$rss
    COMMMAP[$pid]=$comm
    ARGSMAP[$pid]=$args
done < <(ps -e -o pid=,ppid=,state=,rss=,comm=,args=)

is_cron_related()
{
    local pid=$1

    for ((depth=0; depth<100 && pid>1; depth++)); do
        [[ "${COMMMAP[$pid]}" == "crond" ]] && return 0
        pid=${PPIDMAP[$pid]:-0}
    done

    return 1
}

total=0
live=0
zombies=0
rss_total=0
cronds=0

declare -A LIVE_COUNTS
declare -A ZOMBIE_COUNTS

for pid in "${!PPIDMAP[@]}"; do
    is_cron_related "$pid" || continue

    ((total++))

    if [[ "${COMMMAP[$pid]}" == "crond" ]]; then
        ((cronds++))
    fi

    if [[ "${STATEMAP[$pid]}" == "Z" ]]; then
        ((zombies++))
        ((ZOMBIE_COUNTS["${COMMMAP[$pid]}"]++))
    else
        ((live++))
        ((rss_total += ${RSSMAP[$pid]:-0}))
        ((LIVE_COUNTS["${COMMMAP[$pid]}"]++))
    fi
done

echo "============================================================"
echo "Cron process snapshot: $(date)"
echo "============================================================"
printf "Cron-related tasks total : %d\n" "$total"
printf "  LIVE                   : %d\n" "$live"
printf "  ZOMBIES                : %d\n" "$zombies"
printf "  crond                  : %d\n" "$cronds"
printf "Live aggregate RSS       : %.2f GiB\n" \
    "$(awk -v k="$rss_total" 'BEGIN {print k/1048576}')"

echo
echo "LIVE by name:"
for name in "${!LIVE_COUNTS[@]}"; do
    printf "%5d %s\n" "${LIVE_COUNTS[$name]}" "$name"
done | sort -nr

echo
echo "ZOMBIES by name:"
for name in "${!ZOMBIE_COUNTS[@]}"; do
    printf "%5d %s\n" "${ZOMBIE_COUNTS[$name]}" "$name"
done | sort -nr
