return to first page linux journal archive
keywordscontents

#
#	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 -