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