| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #!/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] <PID>"; }
- 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
|