Home | History | Annotate | Line # | Download | only in Bin
dexplorer revision 1.1.1.1
      1  1.1  christos #!/usr/bin/ksh
      2  1.1  christos #
      3  1.1  christos # dexplorer - DTrace system explorer, runs a collection of scripts.
      4  1.1  christos #             Written using DTrace (Solaris 10 3/05).
      5  1.1  christos #
      6  1.1  christos # This program automatically runs a collection of DTrace scripts to examine
      7  1.1  christos # many areas of the system, and places the output in a meaningful directory
      8  1.1  christos # structure that is tar'd and gzip'd.
      9  1.1  christos #
     10  1.1  christos # $Id: dexplorer,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $
     11  1.1  christos #
     12  1.1  christos # USAGE:	dexplorer [-yDT] [-d outputdir] [-i interval]
     13  1.1  christos #
     14  1.1  christos #                  -q              # quiet mode
     15  1.1  christos #                  -y              # "yes", don't prompt for confirmation
     16  1.1  christos #                  -D              # don't delete output dir
     17  1.1  christos #                  -T              # don't create output tar.gz
     18  1.1  christos #                  -d outputdir    # output directory
     19  1.1  christos #                  -i interval     # interval for each sample
     20  1.1  christos #    eg,
     21  1.1  christos #               dexplorer          # default is 5 second samples
     22  1.1  christos #               dexplorer -y -i30  # no prompting, with 30 second samples
     23  1.1  christos #
     24  1.1  christos # SEE ALSO:	DTraceToolkit
     25  1.1  christos #
     26  1.1  christos # THANKS: David Visser, et all. for the idea and encouragement.
     27  1.1  christos #
     28  1.1  christos # COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
     29  1.1  christos #
     30  1.1  christos # CDDL HEADER START
     31  1.1  christos #
     32  1.1  christos #  The contents of this file are subject to the terms of the
     33  1.1  christos #  Common Development and Distribution License, Version 1.0 only
     34  1.1  christos #  (the "License").  You may not use this file except in compliance
     35  1.1  christos #  with the License.
     36  1.1  christos #
     37  1.1  christos #  You can obtain a copy of the license at Docs/cddl1.txt
     38  1.1  christos #  or http://www.opensolaris.org/os/licensing.
     39  1.1  christos #  See the License for the specific language governing permissions
     40  1.1  christos #  and limitations under the License.
     41  1.1  christos #
     42  1.1  christos # CDDL HEADER END
     43  1.1  christos #
     44  1.1  christos # CODE:
     45  1.1  christos #
     46  1.1  christos #  This is currently a monolithic script, and while it contains only
     47  1.1  christos #  a few dozen straigftforward DTrace scripts I think it's desirable to
     48  1.1  christos #  keep it that way. The scripts themselves have designed to be very
     49  1.1  christos #  generic (eg, switching on all sdt:::), and are aggregations to keep a 
     50  1.1  christos #  limit on the size of the output.
     51  1.1  christos #
     52  1.1  christos # Author: Brendan Gregg  [Sydney, Australia]
     53  1.1  christos #
     54  1.1  christos # 23-Jun-2005	Brendan Gregg	Created this.
     55  1.1  christos # 28-Jun-2005	   "      "	Last update.
     56  1.1  christos 
     57  1.1  christos #
     58  1.1  christos #  Default variables
     59  1.1  christos #
     60  1.1  christos interval=5				# time of each sample
     61  1.1  christos verbose=1				# print screen output
     62  1.1  christos prompt=1				# prompt before run
     63  1.1  christos tar=1					# create tar file
     64  1.1  christos delete=1				# delete output dirs
     65  1.1  christos dtrace=/usr/sbin/dtrace			# path to dtrace
     66  1.1  christos root=.					# default output dir
     67  1.1  christos PATH=/usr/bin:/usr/sbin			# safe path
     68  1.1  christos dir=de_`uname -n`_`date +%Y%m%d%H%M`	# OUTPUT FILENAME
     69  1.1  christos samples=20				# max number of tests
     70  1.1  christos current=0				# current sample
     71  1.1  christos 
     72  1.1  christos #
     73  1.1  christos #  Process options
     74  1.1  christos #
     75  1.1  christos while getopts d:hi:qyDT name
     76  1.1  christos do
     77  1.1  christos 	case $name in
     78  1.1  christos 	d)      root=$OPTARG ;;
     79  1.1  christos 	i)      interval=$OPTARG ;;
     80  1.1  christos 	q)      verbose=0 ;;
     81  1.1  christos 	y)      prompt=0 ;;
     82  1.1  christos 	D)      delete=0 ;;
     83  1.1  christos 	T)      tar=0 ;;
     84  1.1  christos 	h|?)    cat <<-END >&2
     85  1.1  christos 		USAGE: dexplorer [-qyDT] [-d outputdir] [-i interval]
     86  1.1  christos 		 
     87  1.1  christos 		        -q               # quiet mode
     88  1.1  christos 		        -y               # "yes", don't prompt for confirmation
     89  1.1  christos 		        -D               # don't delete output dir
     90  1.1  christos 		        -T               # don't create output tar.gz
     91  1.1  christos 		        -d outputdir     # output directory
     92  1.1  christos 		        -i interval      # interval for each sample
     93  1.1  christos 		   eg,
     94  1.1  christos 		       dexplorer         # default is 5 second samples
     95  1.1  christos 		       dexplorer -y -i30 # no prompting, with 30 second samples
     96  1.1  christos 		END
     97  1.1  christos 		exit 1
     98  1.1  christos 	esac
     99  1.1  christos done
    100  1.1  christos shift $(( OPTIND - 1 ))
    101  1.1  christos 
    102  1.1  christos #
    103  1.1  christos #  Confirm path
    104  1.1  christos #
    105  1.1  christos if [[ "$prompt" == "1" ]] ; then
    106  1.1  christos 	if [[ "$root" == "." ]]; then
    107  1.1  christos 		print "Output dir will be the current dir ($PWD)."
    108  1.1  christos 	else
    109  1.1  christos 		print "Output dir will be $root"
    110  1.1  christos 	fi
    111  1.1  christos 	print -n "Hit enter for yes, or type path: "
    112  1.1  christos 	read ans junk
    113  1.1  christos 	if [[ "$ans" == [yY] || "$ans" == [yY]es ]]; then
    114  1.1  christos 		print "WARNING: I didn't ask for \"$ans\"!"
    115  1.1  christos 		print "\tI was asking for the path or just enter."
    116  1.1  christos 		print "\tignoring \"$ans\"..."
    117  1.1  christos 	fi
    118  1.1  christos 	if [[ "$ans" != "" ]]; then
    119  1.1  christos 		root=$ans
    120  1.1  christos 		print "Output is now $root."
    121  1.1  christos 	fi
    122  1.1  christos fi
    123  1.1  christos 
    124  1.1  christos #
    125  1.1  christos #  Sanity checks
    126  1.1  christos #
    127  1.1  christos if [[ "$interval" == *[a-zA-Z]* ]]; then
    128  1.1  christos 	print "ERROR2: Invalid interval $interval.\n"
    129  1.1  christos 	print "Please use a number of seconds."
    130  1.1  christos 	exit 2
    131  1.1  christos fi
    132  1.1  christos if (( ${#interval} < 1 )); then
    133  1.1  christos 	print "ERROR3: Length of interval $interval too short.\n"
    134  1.1  christos 	print "Minimum 1 second."
    135  1.1  christos 	exit 3
    136  1.1  christos fi
    137  1.1  christos if [[ ! -d "$root" ]]; then
    138  1.1  christos 	print "ERROR4: Output directory \"$root\" does not exist.\n"
    139  1.1  christos 	print "Perhaps try a mkdir first?"
    140  1.1  christos 	print "or use an existing dir, eg \"/tmp\""
    141  1.1  christos 	exit 4
    142  1.1  christos fi
    143  1.1  christos if [[ ! -w "$root" ]]; then
    144  1.1  christos 	print "ERROR5: Can't write to output directory \"$root\".\n"
    145  1.1  christos 	print "Are you logged in as root?"
    146  1.1  christos 	print "Perhaps try another directory, eg \"/tmp\""
    147  1.1  christos 	exit 5
    148  1.1  christos fi
    149  1.1  christos if [[ `$dtrace -b1k -qn 'BEGIN { trace(pid); exit(0); }'` == "" ]]; then
    150  1.1  christos 	print "ERROR6: Unable to run dtrace!\n"
    151  1.1  christos 	print "Perhaps this is a permission problem? Try running as root."
    152  1.1  christos 	exit 6
    153  1.1  christos fi
    154  1.1  christos 
    155  1.1  christos # calculate total time
    156  1.1  christos (( total = interval * samples ))
    157  1.1  christos if (( total > 180 )); then
    158  1.1  christos 	(( total = total / 60 ))
    159  1.1  christos 	total="$total minutes"
    160  1.1  christos else
    161  1.1  christos 	total="$total seconds"
    162  1.1  christos fi
    163  1.1  christos 
    164  1.1  christos #
    165  1.1  christos #  Common Functions
    166  1.1  christos #
    167  1.1  christos function decho {
    168  1.1  christos 	if (( verbose )); then print "$*"; fi
    169  1.1  christos }
    170  1.1  christos clean="sed /^\$/d"
    171  1.1  christos header='dtrace:::BEGIN {
    172  1.1  christos 		printf("%Y, ", walltimestamp);
    173  1.1  christos 		printf("%s %s %s %s %s, ", `utsname.sysname, `utsname.nodename,
    174  1.1  christos 		    `utsname.release, `utsname.version, `utsname.machine);
    175  1.1  christos 		printf("%d secs\n",'$interval');
    176  1.1  christos 	}
    177  1.1  christos 	profile:::tick-'$interval'sec { exit(0); }
    178  1.1  christos 	'
    179  1.1  christos function dstatus {
    180  1.1  christos 	if (( verbose )); then 
    181  1.1  christos 		(( percent = current * 100 / samples ))
    182  1.1  christos 		printf "%3d%% $*\n" $percent
    183  1.1  christos 		(( current = current + 1 ))
    184  1.1  christos 	fi
    185  1.1  christos }
    186  1.1  christos 
    187  1.1  christos ########################################
    188  1.1  christos #  START                               #
    189  1.1  christos ########################################
    190  1.1  christos 
    191  1.1  christos #
    192  1.1  christos #  Make dirs
    193  1.1  christos #
    194  1.1  christos err=0
    195  1.1  christos cd $root
    196  1.1  christos (( err = err + $? ))
    197  1.1  christos mkdir $dir
    198  1.1  christos (( err = err + $? ))
    199  1.1  christos cd $dir
    200  1.1  christos (( err = err + $? ))
    201  1.1  christos base1=${PWD##*/}
    202  1.1  christos base2=${dir##*/}
    203  1.1  christos if [[ "$base1" != "$base2" || "$err" != "0" ]]; then
    204  1.1  christos 	print "ERROR7: tried to mkdir $dir from $root, but something failed.\n"
    205  1.1  christos 	print "Check directories before rerunning."
    206  1.1  christos 	exit 7
    207  1.1  christos fi
    208  1.1  christos mkdir Cpu
    209  1.1  christos mkdir Disk
    210  1.1  christos mkdir Mem
    211  1.1  christos mkdir Net
    212  1.1  christos mkdir Proc
    213  1.1  christos mkdir Info
    214  1.1  christos 
    215  1.1  christos #
    216  1.1  christos #  Create Log
    217  1.1  christos #
    218  1.1  christos decho "Starting dexplorer ver 0.76."
    219  1.1  christos decho "Sample interval is $interval seconds. Total run is > $total."
    220  1.1  christos ( print "dexplorer ver 0.76\n------------------"
    221  1.1  christos print -n "System: "
    222  1.1  christos uname -a
    223  1.1  christos print -n "Start:  "
    224  1.1  christos date ) > log
    225  1.1  christos 
    226  1.1  christos #
    227  1.1  christos #  Capture Standard Info
    228  1.1  christos #
    229  1.1  christos args='pid,ppid,uid,gid,projid,zoneid,pset,pri,nice,'
    230  1.1  christos args=$args'class,vsz,rss,time,pcpu,pmem,args'
    231  1.1  christos uname -a > Info/uname-a		# System
    232  1.1  christos psrinfo -v > Info/psrinfo-v	# CPU
    233  1.1  christos prtconf > Info/prtconf		# Memory (+ devices)
    234  1.1  christos df -k > Info/df-k		# Disk
    235  1.1  christos ifconfig -a > Info/ifconfig-a	# Network
    236  1.1  christos ps -eo $args > Info/ps-o	# Processes
    237  1.1  christos uptime > Info/uptime		# Load
    238  1.1  christos 
    239  1.1  christos #
    240  1.1  christos #  Cpu Tests, DTrace
    241  1.1  christos #
    242  1.1  christos 
    243  1.1  christos dstatus "Interrupts by CPU..."
    244  1.1  christos $dtrace -qn "$header"'
    245  1.1  christos 	sdt:::interrupt-start { @num[cpu] = count(); }
    246  1.1  christos 	dtrace:::END
    247  1.1  christos 	{ 
    248  1.1  christos 		printf("%-16s %16s\n", "CPU", "INTERRUPTS");
    249  1.1  christos 		printa("%-16d %@16d\n", @num);
    250  1.1  christos 	}
    251  1.1  christos ' | $clean > Cpu/interrupt_by_cpu
    252  1.1  christos 
    253  1.1  christos dstatus "Interrupt times..."
    254  1.1  christos $dtrace -qn "$header"'
    255  1.1  christos 	sdt:::interrupt-start { self->ts = vtimestamp; }
    256  1.1  christos 	sdt:::interrupt-complete
    257  1.1  christos 	/self->ts && arg0 != 0/
    258  1.1  christos 	{
    259  1.1  christos 		this->devi = (struct dev_info *)arg0;
    260  1.1  christos 		self->name = this->devi != 0 ?
    261  1.1  christos 		    stringof(`devnamesp[this->devi->devi_major].dn_name) : "?";
    262  1.1  christos 		this->inst = this->devi != 0 ? this->devi->devi_instance : 0;
    263  1.1  christos 		@num[self->name, this->inst] = sum(vtimestamp - self->ts);
    264  1.1  christos 		self->name = 0;
    265  1.1  christos 	}
    266  1.1  christos 	sdt:::interrupt-complete { self->ts = 0; }
    267  1.1  christos 	dtrace:::END
    268  1.1  christos 	{ 
    269  1.1  christos 		printf("%11s    %16s\n", "DEVICE", "TIME (ns)");
    270  1.1  christos 		printa("%10s%-3d %@16d\n", @num);
    271  1.1  christos 	}
    272  1.1  christos ' | $clean > Cpu/interrupt_time
    273  1.1  christos 
    274  1.1  christos dstatus "Dispatcher queue length by CPU..."
    275  1.1  christos $dtrace -qn "$header"'
    276  1.1  christos 	profile:::profile-1000
    277  1.1  christos 	{
    278  1.1  christos 		this->num = curthread->t_cpu->cpu_disp->disp_nrunnable;
    279  1.1  christos 		@length[cpu] = lquantize(this->num, 0, 100, 1);
    280  1.1  christos 	}
    281  1.1  christos 	dtrace:::END { printa(" CPU %d%@d\n", @length); }
    282  1.1  christos ' | $clean > Cpu/dispqlen_by_cpu
    283  1.1  christos 
    284  1.1  christos dstatus "Sdt counts..."
    285  1.1  christos $dtrace -qn "$header"'
    286  1.1  christos 	sdt:::{ @num[probefunc, probename] = count(); }
    287  1.1  christos 	dtrace:::END
    288  1.1  christos 	{ 
    289  1.1  christos 		printf("%-32s %-32s %10s\n", "FUNC", "NAME", "COUNT");
    290  1.1  christos 		printa("%-32s %-32s %@10d\n", @num);
    291  1.1  christos 	}
    292  1.1  christos ' | $clean > Cpu/sdt_count
    293  1.1  christos 
    294  1.1  christos #
    295  1.1  christos #  Disk Tests, DTrace
    296  1.1  christos #
    297  1.1  christos 
    298  1.1  christos dstatus "Pages paged in by process..."
    299  1.1  christos $dtrace -qn "$header"'
    300  1.1  christos 	vminfo:::pgpgin { @pg[pid, execname] = sum(arg0); }
    301  1.1  christos 	dtrace:::END
    302  1.1  christos 	{ 
    303  1.1  christos 		printf("%6s %-16s %16s\n", "PID", "CMD", "PAGES");
    304  1.1  christos 		printa("%6d %-16s %@16d\n", @pg);
    305  1.1  christos 	}
    306  1.1  christos ' | $clean > Disk/pgpgin_by_process
    307  1.1  christos 
    308  1.1  christos dstatus "Files opened successfully count..."
    309  1.1  christos $dtrace -qn "$header"'
    310  1.1  christos 	syscall::open*:entry { self->file = copyinstr(arg0); self->ok = 1; }
    311  1.1  christos 	syscall::open*:return /self->ok && arg0 != -1/ 
    312  1.1  christos 	{ 
    313  1.1  christos 		@num[self->file] = count();
    314  1.1  christos 	}
    315  1.1  christos 	syscall::open*:return /self->ok/ { self->file = 0; self->ok = 0; }
    316  1.1  christos 	dtrace:::END
    317  1.1  christos 	{ 
    318  1.1  christos 		printf("%-64s %8s\n", "FILE", "COUNT");
    319  1.1  christos 		printa("%-64s %@8d\n", @num);
    320  1.1  christos 	}
    321  1.1  christos ' | $clean > Disk/fileopen_count
    322  1.1  christos 
    323  1.1  christos dstatus "Disk I/O size distribution by process..."
    324  1.1  christos $dtrace -qn "$header"'
    325  1.1  christos 	io:::start { @size[pid, execname] = quantize(args[0]->b_bcount); }
    326  1.1  christos ' | $clean > Disk/sizedist_by_process
    327  1.1  christos 
    328  1.1  christos #
    329  1.1  christos #  Mem Tests, DTrace
    330  1.1  christos #
    331  1.1  christos 
    332  1.1  christos dstatus "Minor faults by process..."
    333  1.1  christos $dtrace -qn "$header"'
    334  1.1  christos 	vminfo:::as_fault { @mem[pid, execname] = sum(arg0); }
    335  1.1  christos 	dtrace:::END
    336  1.1  christos 	{ 
    337  1.1  christos 		printf("%6s %-16s %16s\n", "PID", "CMD", "MINFAULTS");
    338  1.1  christos 		printa("%6d %-16s %@16d\n", @mem);
    339  1.1  christos 	}
    340  1.1  christos ' | $clean > Mem/minf_by_process
    341  1.1  christos 
    342  1.1  christos 
    343  1.1  christos dstatus "Vminfo data by process..."
    344  1.1  christos $dtrace -qn "$header"'
    345  1.1  christos 	vminfo::: { @data[pid, execname, probename] = sum(arg0); }
    346  1.1  christos 	dtrace:::END
    347  1.1  christos 	{ 
    348  1.1  christos 		printf("%6s %-16s %-16s %16s\n",
    349  1.1  christos 		    "PID", "CMD", "STATISTIC", "VALUE");
    350  1.1  christos 		printa("%6d %-16s %-16s %@16d\n", @data);
    351  1.1  christos 	}
    352  1.1  christos ' | $clean > Mem/vminfo_by_process
    353  1.1  christos 
    354  1.1  christos #
    355  1.1  christos #  Net Tests, DTrace
    356  1.1  christos #
    357  1.1  christos 
    358  1.1  christos dstatus "Mib data by mib statistic..."
    359  1.1  christos $dtrace -qn "$header"'
    360  1.1  christos 	mib::: { @data[probename] = sum(arg0); }
    361  1.1  christos 	dtrace:::END
    362  1.1  christos 	{ 
    363  1.1  christos 		printf("%-32s %16s\n", "STATISTIC", "VALUE");
    364  1.1  christos 		printa("%-32s %@16d\n", @data);
    365  1.1  christos 	}
    366  1.1  christos ' | $clean > Net/mib_data
    367  1.1  christos 
    368  1.1  christos dstatus "TCP write bytes by process..."
    369  1.1  christos $dtrace -qn "$header"'
    370  1.1  christos 	fbt:ip:tcp_output:entry
    371  1.1  christos 	{
    372  1.1  christos 		this->size = msgdsize(args[1]);
    373  1.1  christos 		@size[pid, execname] = sum(this->size);
    374  1.1  christos 	}
    375  1.1  christos 	dtrace:::END
    376  1.1  christos 	{ 
    377  1.1  christos 		printf("%6s %-16s %12s\n", "PID", "CMD", "BYTES");
    378  1.1  christos 		printa("%6d %-16s %@12d\n", @size);
    379  1.1  christos 	}
    380  1.1  christos ' | $clean > Net/tcpw_by_process
    381  1.1  christos 
    382  1.1  christos #
    383  1.1  christos #  Proc Tests, DTrace
    384  1.1  christos #
    385  1.1  christos 
    386  1.1  christos dstatus "Sample process @ 1000 Hz..."
    387  1.1  christos $dtrace -qn "$header"'
    388  1.1  christos 	profile:::profile-1000
    389  1.1  christos 	{
    390  1.1  christos 		@num[pid, curpsinfo->pr_psargs] = count();
    391  1.1  christos 	}
    392  1.1  christos 	dtrace:::END
    393  1.1  christos 	{ 
    394  1.1  christos 		printf("%6s %12s %s\n", "PID", "SAMPLES", "ARGS");
    395  1.1  christos 		printa("%6d %@12d %S\n", @num);
    396  1.1  christos 	}
    397  1.1  christos ' | $clean > Proc/sample_process
    398  1.1  christos 
    399  1.1  christos dstatus "Syscall count by process..."
    400  1.1  christos $dtrace -qn "$header"'
    401  1.1  christos 	syscall:::entry { @num[pid, execname, probefunc] = count(); }
    402  1.1  christos 	dtrace:::END
    403  1.1  christos 	{ 
    404  1.1  christos 		printf("%6s %-24s %-24s %8s\n",
    405  1.1  christos 		    "PID", "CMD", "SYSCALL", "COUNT");
    406  1.1  christos 		printa("%6d %-24s %-24s %@8d\n", @num);
    407  1.1  christos 	}
    408  1.1  christos ' | $clean > Proc/syscall_by_process
    409  1.1  christos 
    410  1.1  christos dstatus "Syscall count by syscall..."
    411  1.1  christos $dtrace -qn "$header"'
    412  1.1  christos 	syscall:::entry { @num[probefunc] = count(); }
    413  1.1  christos 	dtrace:::END
    414  1.1  christos 	{ 
    415  1.1  christos 		printf("%-32s %16s\n", "SYSCALL", "COUNT");
    416  1.1  christos 		printa("%-32s %@16d\n", @num);
    417  1.1  christos 	}
    418  1.1  christos ' | $clean > Proc/syscall_count
    419  1.1  christos 
    420  1.1  christos dstatus "Read bytes by process..."
    421  1.1  christos $dtrace -qn "$header"'
    422  1.1  christos 	sysinfo:::readch { @bytes[pid, execname] = sum(arg0); }
    423  1.1  christos 	dtrace:::END
    424  1.1  christos 	{ 
    425  1.1  christos 		printf("%6s %-16s %16s\n", "PID", "CMD", "BYTES");
    426  1.1  christos 		printa("%6d %-16s %@16d\n", @bytes);
    427  1.1  christos 	}
    428  1.1  christos ' | $clean > Proc/readb_by_process
    429  1.1  christos 
    430  1.1  christos dstatus "Write bytes by process..."
    431  1.1  christos $dtrace -qn "$header"'
    432  1.1  christos 	sysinfo:::writech { @bytes[pid, execname] = sum(arg0); }
    433  1.1  christos 	dtrace:::END
    434  1.1  christos 	{ 
    435  1.1  christos 		printf("%6s %-16s %16s\n", "PID", "CMD", "BYTES");
    436  1.1  christos 		printa("%6d %-16s %@16d\n", @bytes);
    437  1.1  christos 	}
    438  1.1  christos ' | $clean > Proc/writeb_by_process
    439  1.1  christos 
    440  1.1  christos dstatus "Sysinfo counts by process..."
    441  1.1  christos $dtrace -qn "$header"'
    442  1.1  christos 	sysinfo::: { @num[pid, execname, probename] = sum(arg0); }
    443  1.1  christos 	dtrace:::END
    444  1.1  christos 	{ 
    445  1.1  christos 		printf("%6s %-16s %-16s %16s\n", 
    446  1.1  christos 		    "PID", "CMD", "STATISTIC", "COUNT");
    447  1.1  christos 		printa("%6d %-16s %-16s %@16d\n", @num);
    448  1.1  christos 	}
    449  1.1  christos ' | $clean > Proc/sysinfo_by_process
    450  1.1  christos 
    451  1.1  christos dstatus "New process counts with arguments..."
    452  1.1  christos $dtrace -qn "$header"'
    453  1.1  christos 	proc:::exec-success
    454  1.1  christos 	{
    455  1.1  christos 		@num[pid, ppid, curpsinfo->pr_psargs] = count();
    456  1.1  christos 	}
    457  1.1  christos 	dtrace:::END
    458  1.1  christos 	{ 
    459  1.1  christos 		printf("%6s %6s %8s %s\n", "PID", "PPID", "COUNT", "ARGS");
    460  1.1  christos 		printa("%6d %6d %@8d %S\n", @num);
    461  1.1  christos 	}
    462  1.1  christos ' | $clean > Proc/newprocess_count
    463  1.1  christos 
    464  1.1  christos dstatus "Signal counts..."
    465  1.1  christos $dtrace -qn "$header"'
    466  1.1  christos 	proc:::signal-send { 
    467  1.1  christos 		@num[execname,args[2],stringof(args[1]->pr_fname)] = count();
    468  1.1  christos 	}
    469  1.1  christos 	dtrace:::END
    470  1.1  christos 	{ 
    471  1.1  christos 		printf("%-16s %-8s %-16s %8s\n",
    472  1.1  christos 		    "FROM", "SIG", "TO", "COUNT");
    473  1.1  christos 		printa("%-16s %-8d %-16s %@8d\n", @num);
    474  1.1  christos 	}
    475  1.1  christos ' | $clean > Proc/signal_count
    476  1.1  christos 
    477  1.1  christos dstatus "Syscall error counts..."
    478  1.1  christos $dtrace -qn "$header"'
    479  1.1  christos 	syscall:::return /(int)arg0 == -1/
    480  1.1  christos 	{
    481  1.1  christos 		@num[pid, execname, probefunc, errno] = count();
    482  1.1  christos 	}
    483  1.1  christos 	dtrace:::END
    484  1.1  christos 	{ 
    485  1.1  christos 		printf("%6s %-16s %-32s %-6s %8s\n",
    486  1.1  christos 		    "PID", "CMD", "SYSCALL", "ERRNO", "COUNT");
    487  1.1  christos 		printa("%6d %-16s %-32s %-6d %@8d\n", @num);
    488  1.1  christos 	}
    489  1.1  christos ' | $clean > Proc/syscall_errors
    490  1.1  christos 
    491  1.1  christos 
    492  1.1  christos ###########
    493  1.1  christos #  Done
    494  1.1  christos #
    495  1.1  christos ( print -n "End:    "
    496  1.1  christos date ) >> log
    497  1.1  christos decho "100% Done."
    498  1.1  christos if (( tar )); then
    499  1.1  christos 	cd ..
    500  1.1  christos 	tar cf $dir.tar $dir
    501  1.1  christos 	gzip $dir.tar
    502  1.1  christos 	decho "File is $dir.tar.gz"
    503  1.1  christos fi
    504  1.1  christos if (( delete && tar )); then
    505  1.1  christos 	cd $dir
    506  1.1  christos 	# this could be all an "rm -r $dir", but since it will be run 
    507  1.1  christos 	# as root on production servers - lets be analy cautious,
    508  1.1  christos 	rm Cpu/interrupt_by_cpu
    509  1.1  christos 	rm Cpu/interrupt_time
    510  1.1  christos 	rm Cpu/dispqlen_by_cpu
    511  1.1  christos 	rm Cpu/sdt_count
    512  1.1  christos 	rm Disk/pgpgin_by_process
    513  1.1  christos 	rm Disk/fileopen_count
    514  1.1  christos 	rm Disk/sizedist_by_process
    515  1.1  christos 	rm Mem/minf_by_process
    516  1.1  christos 	rm Mem/vminfo_by_process
    517  1.1  christos 	rm Net/mib_data
    518  1.1  christos 	rm Net/tcpw_by_process
    519  1.1  christos 	rm Proc/sample_process
    520  1.1  christos 	rm Proc/syscall_by_process
    521  1.1  christos 	rm Proc/syscall_count
    522  1.1  christos 	rm Proc/readb_by_process
    523  1.1  christos 	rm Proc/writeb_by_process
    524  1.1  christos 	rm Proc/sysinfo_by_process
    525  1.1  christos 	rm Proc/newprocess_count
    526  1.1  christos 	rm Proc/signal_count
    527  1.1  christos 	rm Proc/syscall_errors
    528  1.1  christos 	rmdir Cpu
    529  1.1  christos 	rmdir Disk
    530  1.1  christos 	rmdir Mem
    531  1.1  christos 	rmdir Net
    532  1.1  christos 	rmdir Proc
    533  1.1  christos 	rm Info/uname-a
    534  1.1  christos 	rm Info/psrinfo-v
    535  1.1  christos 	rm Info/prtconf
    536  1.1  christos 	rm Info/df-k
    537  1.1  christos 	rm Info/ifconfig-a
    538  1.1  christos 	rm Info/ps-o
    539  1.1  christos 	rm Info/uptime
    540  1.1  christos 	rmdir Info
    541  1.1  christos 	rm log
    542  1.1  christos 	cd ..
    543  1.1  christos 	rmdir $dir
    544  1.1  christos else
    545  1.1  christos 	decho "Directory is $dir"
    546  1.1  christos fi
    547  1.1  christos 
    548