bin bash Written by razum2um Last modified Sun 19 Jul 2009 12 43 29 07

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/bash
#
# Written by razum2um
# Last modified Sun, 19 Jul 2009 12:43:29 +0700
#
###################################################################################
################################# USER-DENINED ####################################
###################################################################################
TIMEZONE=7 # Your timezone ( GMT+ )
DELAY=1 # pause between logging (sec)
DELTA_END_M=60 # monitoring time ( min, default 1h )
OUTPUT_FILE_PREFIX=watched_for
OUTPUT_FILE_DIR=~
TMP_FILE=~/.watcher # log-file
###################################################################################
############################## PARAMETERS CHECK ###################################
###################################################################################
USAGE_STRING="Usage: $0 <process name> [monitoring time (min) [pause between logging (sec)]]"
if [ $# -eq 3 ]
then
DELAY=$3
DELTA_END_M=$2
elif [ $# -eq 2 ]
then
DELTA_END_M=$2
elif [ $# -eq 1 ]
then
PID_PROC=`pidof $1 | head -n1`
if [ `top -b -n 1 -p $PID_PROC | grep $1 | wc -l` -eq 0 ]
then
echo "Process $1 doesn't exist!"
exit 1
fi
else
echo $USAGE_STRING
exit 1
fi
PROC=$1
PID_PROC=`pidof $1 | head -n1`
START_TIME=`date +%s`
DELTA_END_SEC=`expr $DELTA_END_M \* 60`
END_TIME=`expr $START_TIME + $DELTA_END_SEC`
TIME_SHIFT=`expr $TIMEZONE \* 3600` # to be added to time written into log
OUTPUT_FILE_PATH=${OUTPUT_FILE_DIR}/${OUTPUT_FILE_PREFIX}_${PROC}.png
###################################################################################
##################################### INFO #######################################
###################################################################################
FONT_BOLD='\e[1m'
FONT_GREEN_BOLD='\e[32m'$FONT_BOLD
FONT_RED_BOLD='\e[31m'$FONT_BOLD
FONT_NORM='\e[0m'
echo -e "Now\t\t\t $FONT_GREEN_BOLD`date +%c`$FONT_NORM"
echo -e "Stops at\t\t $FONT_RED_BOLD`date -d @$END_TIME +%c`$FONT_NORM"
echo
echo -e "${FONT_BOLD}Output into$FONT_NORM\t\t $OUTPUT_FILE_PATH"
echo -e "${FONT_BOLD}Log into$FONT_NORM\t\t $TMP_FILE"
###################################################################################
################################### LOGGING #######################################
###################################################################################
echo -n > $TMP_FILE
while [ `date +%s` -lt $END_TIME ]
do
NOW=`date +%s`
echo -n "`expr $NOW + $TIME_SHIFT` " >> $TMP_FILE
top -b -n 1 -p $PID_PROC | grep $PROC >> $TMP_FILE
sleep $DELAY
done
###################################################################################
################################### PLOTTING ######################################
###################################################################################
PERFORMED_AT=`date +%d/%m/%y`
U_MAX_LOAD_TIME=`cat .watcher | awk '{print $10 " " $1}' | sort | tail -n1 | awk '{print $2}'`
U_MIN_LOAD_TIME=`cat .watcher | awk '{print $10 " " $1}' | sort -r | tail -n1 | awk '{print $2}'`
REAL_U_MAX_LOAD_TIME=`expr $U_MAX_LOAD_TIME - $TIME_SHIFT`
REAL_U_MIN_LOAD_TIME=`expr $U_MIN_LOAD_TIME - $TIME_SHIFT`
REAL_MAX_LOAD_TIME=`date -d @$REAL_U_MAX_LOAD_TIME +%H:%M:%S`
REAL_MIN_LOAD_TIME=`date -d @$REAL_U_MIN_LOAD_TIME +%H:%M:%S`
if [ $DELTA_END_M -lt 60 ]
then
FORMAT_X='%Mm%Ss'
else
FORMAT_X='%Hh%Mm'
fi
echo "set terminal png enhanced
set output \"$OUTPUT_FILE_PATH\"
set xdata time
set timefmt \"%s\"
set format x \"$FORMAT_X\"
set xlabel \"Time\"
set ylabel \"CPU load, %\"
set yrange [0:100]
set title \"$PROC at $PERFORMED_AT \n Maximum at: $REAL_MAX_LOAD_TIME \n Minimum at: $REAL_MIN_LOAD_TIME\"
plot \"~/.watcher\" using 1:10 notitle with lines" | gnuplot
###################################################################################
rm $TMP_FILE
echo "$OUTPUT_FILE_PATH created successfully"
exit 0