|
| 1 | +#! /bin/bash |
| 2 | + |
| 3 | +#---------------------------------------------------------------------- |
| 4 | +# Description: watch raw input output per block device stats in real time |
| 5 | +# Author: Artem S. Tashkinov |
| 6 | +# Created at: Sat Apr 6 18:34:33 2013 |
| 7 | +# Computer: localhost.localdomain |
| 8 | +# System: Linux 3.8.7-ic on i686 |
| 9 | +# |
| 10 | +# Copyright (c) 2013 Artem S. Tashkinov All rights reserved. |
| 11 | +# Sat Aug 24 19:59:32 2013 - implemented read/write interval counters |
| 12 | +# Sun Aug 25 23:51:14 2013 - made refreshing three times faster |
| 13 | +# Thu Feb 4 18:59:41 2016 - exit on pressing q/Q, read refresh rate from console |
| 14 | +# |
| 15 | +#---------------------------------------------------------------------- |
| 16 | + |
| 17 | +shopt -s nullglob |
| 18 | +export LANG=en_US.UTF-8 |
| 19 | +rr=2 |
| 20 | + |
| 21 | +trap "exit 0" TERM |
| 22 | +export TOP_PID=$$ |
| 23 | + |
| 24 | +qexit() |
| 25 | +{ |
| 26 | + read -n 1 -t 0.5 -s char |
| 27 | + if [ "$char" = "q" -o "$char" = "Q" ]; then |
| 28 | + echo "Bye" |
| 29 | + kill -s TERM $TOP_PID |
| 30 | + fi |
| 31 | +} |
| 32 | + |
| 33 | +if [ -n "$1" ]; then |
| 34 | + if [ "$1" -eq "$1" ] 2>/dev/null; then |
| 35 | + rr="$1" |
| 36 | + else |
| 37 | + echo "[$1] is not a number, setting refresh rate to $rr" |
| 38 | + sleep 3 |
| 39 | + fi |
| 40 | +fi |
| 41 | + |
| 42 | +dsrc=/sys/block |
| 43 | +cd $dsrc || die "$dsrc not found" |
| 44 | + |
| 45 | +declare -A intr intw blkr blkw |
| 46 | + |
| 47 | +while :; do |
| 48 | + clear |
| 49 | + date | tr -d '\n' |
| 50 | + echo " [ refresh rate: ${rr} seconds ]" |
| 51 | + echo "Device Read bytes Written bytes Interval read Interval written Mount point" |
| 52 | + for i in sd* md*; do # adjust for your environment |
| 53 | + for j in $i/$i* $i; do |
| 54 | + dev=${j##*/} |
| 55 | + test -z "$dev" && dev="$j" # when iterating $i itself |
| 56 | + |
| 57 | + read blkr blkw < <(awk '{print $3" "$7}' $j/stat) # let's speed up this a bit |
| 58 | + blkr["$dev"]=$blkr |
| 59 | + blkw["$dev"]=$blkw |
| 60 | + |
| 61 | + test -z "${intr[$dev]}" && intr[$dev]=0 |
| 62 | + test -z "${intw[$dev]}" && intw[$dev]=0 |
| 63 | + intr[$dev]=$((${blkr[$dev]}-${intr[$dev]})) |
| 64 | + intw[$dev]=$((${blkw[$dev]}-${intw[$dev]})) |
| 65 | + test "${blkr[$dev]}" == "${intr[$dev]}" && intr[$dev]=0 # Don't show when iterating for the first time |
| 66 | + test "${blkw[$dev]}" == "${intw[$dev]}" && intw[$dev]=0 |
| 67 | + |
| 68 | + printf "%-7s %'17d %'17d %'14d %'14d " $dev $((blkr[$dev]*512)) $((blkw[$dev]*512)) $((intr[$dev]*512)) $((intw[$dev]*512)) |
| 69 | + |
| 70 | + mntp=`awk '/^\/dev\/'$dev' /{print $2}' /proc/mounts` |
| 71 | + if [ -z "$mntp" ]; then |
| 72 | + grep -q "root=/dev/$dev " /proc/cmdline && mntp="/" |
| 73 | + fi |
| 74 | + echo "$mntp" |
| 75 | + |
| 76 | + intr["$dev"]=${blkr["$dev"]} |
| 77 | + intw["$dev"]=${blkw["$dev"]} |
| 78 | + done |
| 79 | + echo |
| 80 | + done |
| 81 | + qexit < /dev/stdin & |
| 82 | + sleep $rr |
| 83 | +done |
0 commit comments