#!/usr/bin/sh
opt_all=0; opt_time=1; opt_top=0; top=0; interval=1; count=1
while getopts aht:V name
do
case $name in
a) opt_all=1 ;;
V) opt_time=0 ;;
t) opt_top=1; top=$OPTARG ;;
h|?) cat <<-END >&2
USAGE: cpudists [-ahV] [-t top] [interval [count]]
cpudists -a -V -t num END
exit 1
esac
done
shift `expr $OPTIND - 1`
if [ "$1" -gt 0 ]; then
interval=$1; count=-1; shift
fi
if [ "$1" -gt 0 ]; then
count=$1; shift
fi
/usr/sbin/dtrace -n '
/*
* Command line arguments
*/
inline int OPT_all = '$opt_all';
inline int OPT_time = '$opt_time';
inline int OPT_top = '$opt_top';
inline int TOP = '$top';
inline int INTERVAL = '$interval';
inline int COUNTER = '$count';
/* Initialise variables */
dtrace:::BEGIN
{
cpustart[cpu] = 0;
counts = COUNTER;
secs = INTERVAL;
}
/* Flag this thread as idle */
sysinfo:unix:idle_enter:idlethread
{
idle[cpu] = 1;
}
/* Save kernel time between running threads */
sched:::on-cpu
/cpustart[cpu]/
{
this->elapsed = timestamp - cpustart[cpu];
@Procs["KERNEL"] = quantize(this->elapsed);
}
/* Save the elapsed time of a thread */
sched:::off-cpu,
sched:::remain-cpu,
profile:::profile-1sec
/cpustart[cpu]/
{
/* determine the name for this thread */
program[cpu] = pid == 0 ? idle[cpu] ? "IDLE" : "KERNEL" :
OPT_all ? execname : "PROCESS";
/* save elapsed */
this->elapsed = timestamp - cpustart[cpu];
@Procs[program[cpu]] = quantize(this->elapsed);
cpustart[cpu] = timestamp;
}
/* Record the start time of a thread */
sched:::on-cpu,
sched:::remain-cpu
{
idle[cpu] = 0;
cpustart[cpu] = timestamp;
}
profile:::tick-1sec
{
secs--;
}
/* Print time */
profile:::tick-1sec
/secs == 0 && OPT_time/
{
printf("%Y,\n", walltimestamp);
}
/* Print report */
profile:::tick-1sec
/secs == 0/
{
OPT_top ? trunc(@Procs, TOP) : 1;
printa("%16s %@16d\n", @Procs);
trunc(@Procs);
secs = INTERVAL;
counts--;
}
/* End of program */
profile:::tick-1sec
/counts == 0/
{
exit(0);
}
/* cleanup for Ctrl-C */
dtrace:::END
{
trunc(@Procs);
}
'