#
# Make a System Activity Graph
#
# This will be a little confusing to read...
# it contains quotes of 'lout' code embedded within an 'awk' script;
# they both use lots of braces.
#
#
# Write the 'lout' statements to setup the graph
#
( echo "@SysInclude {graph}
@SysInclude {doc}
@Document
@InitialFont {Helvetica Base 10p}
@PageHeaders {None}
//
@Text @Begin
@Display 90d @Rotate @Graph
width {8 in}
height {5.5 in}
abovecaption {System Activity Graph: User, System, and Idle Percentages}
belowcaption {Ten minute period starting on `date`}
leftcaption {90d @Rotate {Percent of System Used}}
hidecaptions {no}
xticks { 0@ 1@ 2@ 3@ 4@ 5@ 6@ 7@ 8@ 9@ 10@ }
yextra {0}
xextra {0}"
#
# run "vmstat" to get system data
# read the data lines; store selected data in arrays
# at end of the data, generate the remainder of the 'lout' statements
#
vmstat -n 10 60 | awk '
BEGIN {
n = 0 # initialize data-point counter
}
{
if ( $0 ~ /[a-zA-Z]/ ) # skip over header lines
next
# save selected data values
user[n] = $13 # user %
syst[n] = $14 # system %
idle[n] = $15 # idle %
n++
}
#
# we have all the values
# generate data statements for lout
#
function gen_data(array, dot, line) {
printf("@Data ") # start a data group
if ( dot != "" )
printf("points { %s } ", dot) # set data-point style
printf("pairs { %s } {\n", line) # x/y pairs, line-style
for ( i = 0; i < n; i++ ) { # write the data values
printf("%f %d\n", i/6.0, array[i])
}
print "}" # end this data group
}
END {
# print the identifier at the end of each plot
print "objects {"
printf(" @E at {%d %d} {User}\n", (n+2)/6.0, user[n-1])
printf(" @E at {%d %d} {System}\n", (n+2)/6.0, syst[n-1])
printf(" @E at {%d %d} {Idle}\n", (n+2)/6.0, idle[n-1])
print "}"
# now generate the data body
print "{ "
gen_data(user, "filledcircle", "solid")
gen_data(syst, "", "dashed")
gen_data(idle, "", "dotted");
print "}"
# and finish-up the document
print "@End @Text"
}' ) | lout -s -
Copyright © 1994 - 2019 Linux Journal. All rights reserved.