vmrss 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. R='\033[0m' B='\033[1m' D='\033[2m' RED='\033[31m' BLU='\033[38;5;33m' YLW='\033[38;5;179m'
  4. die() { printf "${RED}${B}error:${R} %s\n" "$1" >&2; exit 1; }
  5. usage() { die "usage: $0 [-w] [-i interval] <PID>"; }
  6. WATCH=0 INTERVAL=1
  7. while getopts "wi:" opt; do
  8. case "$opt" in
  9. w) WATCH=1 ;; i) INTERVAL="$OPTARG" ;; *) usage ;;
  10. esac
  11. done
  12. shift $((OPTIND - 1))
  13. PID="${1:-}"
  14. if [ -z "$PID" ]; then
  15. command -v fzf >/dev/null 2>&1 || usage
  16. PID=$(ps -eo pid,user,%mem,comm --sort=-%mem | fzf --header-lines=1 | awk '{print $1}')
  17. [ -z "$PID" ] && exit 0
  18. fi
  19. ps -p "$PID" >/dev/null 2>&1 || die "process $PID does not exist"
  20. COMM=$(cat /proc/"$PID"/comm 2>/dev/null || echo "?")
  21. print_rss() {
  22. read -r rss peak size swap < <(awk '
  23. /^VmRSS:/ { rss=$2 }
  24. /^VmPeak:/ { peak=$2 }
  25. /^VmSize:/ { size=$2 }
  26. /^VmSwap:/ { swap=$2 }
  27. END { print rss, peak, size, swap }
  28. ' /proc/"$PID"/status 2>/dev/null) || die "could not read memory for PID $PID"
  29. fmt() { awk -v kb="$1" 'BEGIN { printf "%.1f MB", kb/1024 }'; }
  30. printf "${B}%s${R} ${D}(PID %s)${R}\n" "$COMM" "$PID"
  31. printf " ${YLW}${B}RSS:${R} ${BLU}%s${R} ${D}Peak:${R} %s ${D}Size:${R} %s ${D}Swap:${R} %s\n" \
  32. "$(fmt "$rss")" "$(fmt "$peak")" "$(fmt "$size")" "$(fmt "$swap")"
  33. }
  34. if [ "$WATCH" -eq 1 ]; then
  35. printf '\033[?25l'
  36. trap 'printf "\033[?25h"; exit' INT TERM
  37. first=1
  38. while ps -p "$PID" >/dev/null 2>&1; do
  39. [ "$first" -eq 0 ] && printf '\033[2A'
  40. first=0
  41. print_rss
  42. sleep "$INTERVAL"
  43. done
  44. printf '\033[?25h'
  45. die "process $PID exited"
  46. else
  47. print_rss
  48. fi