#!/usr/bin/env bash set -euo pipefail R='\033[0m' B='\033[1m' D='\033[2m' RED='\033[31m' BLU='\033[38;5;33m' YLW='\033[38;5;179m' die() { printf "${RED}${B}error:${R} %s\n" "$1" >&2; exit 1; } usage() { die "usage: $0 [-w] [-i interval] "; } WATCH=0 INTERVAL=1 while getopts "wi:" opt; do case "$opt" in w) WATCH=1 ;; i) INTERVAL="$OPTARG" ;; *) usage ;; esac done shift $((OPTIND - 1)) PID="${1:-}" if [ -z "$PID" ]; then command -v fzf >/dev/null 2>&1 || usage PID=$(ps -eo pid,user,%mem,comm --sort=-%mem | fzf --header-lines=1 | awk '{print $1}') [ -z "$PID" ] && exit 0 fi ps -p "$PID" >/dev/null 2>&1 || die "process $PID does not exist" COMM=$(cat /proc/"$PID"/comm 2>/dev/null || echo "?") print_rss() { read -r rss peak size swap < <(awk ' /^VmRSS:/ { rss=$2 } /^VmPeak:/ { peak=$2 } /^VmSize:/ { size=$2 } /^VmSwap:/ { swap=$2 } END { print rss, peak, size, swap } ' /proc/"$PID"/status 2>/dev/null) || die "could not read memory for PID $PID" fmt() { awk -v kb="$1" 'BEGIN { printf "%.1f MB", kb/1024 }'; } printf "${B}%s${R} ${D}(PID %s)${R}\n" "$COMM" "$PID" printf " ${YLW}${B}RSS:${R} ${BLU}%s${R} ${D}Peak:${R} %s ${D}Size:${R} %s ${D}Swap:${R} %s\n" \ "$(fmt "$rss")" "$(fmt "$peak")" "$(fmt "$size")" "$(fmt "$swap")" } if [ "$WATCH" -eq 1 ]; then printf '\033[?25l' trap 'printf "\033[?25h"; exit' INT TERM first=1 while ps -p "$PID" >/dev/null 2>&1; do [ "$first" -eq 0 ] && printf '\033[2A' first=0 print_rss sleep "$INTERVAL" done printf '\033[?25h' die "process $PID exited" else print_rss fi