Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- term=${1:-wxt}
- if [[ $term =~ ^- ]]; then
- echo "Usage: ${0##*/} TERM"
- echo "Example TERM:"
- echo '"wxt": gtk'
- echo '(buggy) "x11": x11 (Examine man gnuplot for custom color scheme. Problematic with constant raising.)'
- echo '"dumb": plain text'
- exit
- fi
- shopt -s nullglob
- IFS=$'\n\t ' #make \n first for "*" expansion which uses the first character.
- tput civis
- gpfile=/dev/shm/plotter_file_$$
- trap "rm $gpfile; tput cnorm; exit" INT TERM
- function updatedata() {
- #DOWN
- totaldown=0
- for network in /sys/class/net/{eth,wlan}*/statistics/rx_bytes; do
- read network < $network
- (( totaldown+=network ))
- done
- (( oldtotaldown != 0 )) && DOWN=$(( (totaldown - oldtotaldown) /1024)) || DOWN=0
- oldtotaldown=$totaldown
- #UP
- totalup=0
- for network in /sys/class/net/{eth,wlan}*/statistics/tx_bytes; do
- read network < $network
- (( totalup+=network ))
- done
- (( oldtotalup != 0 )) && UP=$(( (totalup - oldtotalup) /1024)) || UP=0
- oldtotalup=$totalup
- #CPU
- read cpu a b c idle rest < /proc/stat
- total=$((a+b+c+idle))
- intervaltotal=$((total-prevtotal))
- (( prevtotal != 0 )) && CPU=$((100* ( intervaltotal - (idle - previdle) ) / intervaltotal)) || CPU=0
- prevtotal=$total
- previdle=$idle
- #MEM
- while read type size kb; do
- [[ $type == MemTotal: ]] && total=$size && used=$total
- [[ $type =~ (MemFree|Buffers|Cached): ]] && ((used-=size))
- done < /proc/meminfo
- MEM=$(( (100 * used) / total))
- }
- #Configure $TITLE
- function updatetitle() {
- DAY=$(date +%a)
- TIME=$(date +"%H:%M")
- DATE=$(date +"%b %d")
- TITLE="($DAY) $TIME ($DATE)"
- }
- function updatetics() {
- now=$(date +"%H:%M:%S" -d "10 seconds")
- minuteago=$(date +"%H:%M:%S" -d "50 seconds ago")
- }
- if [[ $term == dumb ]]; then
- color=31
- sedcolorizer=$(
- for drawing in '*' '#' '$' '%'; do
- echo "s/\\$drawing\+/\\x1b[$((color++))m&\\x1b[m/g"
- done
- echo "s/[|+]\+\( [0-9]*\)*$/\\x1b[33m&\\x1b[m/"
- )
- fi
- counter=0
- minuteago=$(date +"%H:%M:%S")
- now=$(date +"%H:%M:%S" -d "1 minute")
- sleep 0.$((1000000000 - $(date +%-N) ))s
- {
- [[ $term != dumb ]] && echo "set term $term noraise title 'Gnuplot$$'"
- echo 'set grid'
- echo 'set logscale y'
- # echo 'set ytics 0,250'
- echo 'unset mytics'
- echo 'set y2tics 0,25'
- while [[ $term == dumb ]] || [[ $counter = 0 ]] || wmctrl -l | grep -q Gnuplot$$; do
- [[ $term = dumb ]] && echo "set term dumb $(($(tput cols)+7)) $(($(tput lines)+2))"
- #reset axes every time, because you can zoom-in without zooming-out (X11)
- echo 'set xrange[0:60]'
- echo 'set yrange[1:2000]'
- echo 'set y2range[0:100]'
- #update x-axis every 10 seconds
- if (( ++counter == 61 )); then
- updatecounter=9
- while (( ++updatecounter != 61 )); do
- data[$((updatecounter-10))]=${data[$updatecounter]}
- unset "data[$updatecounter]"
- done
- updatetics
- (( counter-=10 ))
- fi
- echo "set xtics ('$minuteago' 0, '' 10, '' 20, '' 30, '' 40, '' 50, '$now' 60)"
- #gather and print data to temporary file
- updatedata
- printf -v "data[$counter]" "%s\t" $UP $DOWN $CPU $MEM
- echo "${data[*]}" > $gpfile
- updatetitle
- echo "set title '$TITLE'"
- echo "plot '$gpfile' using 1 title 'Upload' with lines, \
- '$gpfile' using 2 title 'Download' with lines, \
- '$gpfile' using 3 title 'CPU' axes x1y2 with lines, \
- '$gpfile' using 4 title 'MEM' axes x1y2 with lines"
- #sleep to about the whole second
- sleep 0.$((1000000000 - $(date +%-N) ))s
- done
- } | gnuplot | { [[ $term = dumb ]] && sed -e "$sedcolorizer" -e 's/^ //;/^$/d'; }
- rm $gpfile
- tput cnorm
Advertisement
Add Comment
Please, Sign In to add comment