1 #!/usr/sbin/dtrace -Zs 2 /* 3 * sh_stat.d - Bourne shell operation stats using DTrace. 4 * Written for the sh DTrace provider. 5 * 6 * $Id: sh_stat.d,v 1.1.1.1 2015/09/30 22:01:09 christos Exp $ 7 * 8 * This traces activity from all sh processes on the system that are running 9 * with sh provider support. 10 * 11 * USAGE: sh_stat.d [interval [count]] 12 * 13 * FIELDS: 14 * EXEC/s Bourne shells executed per second, including 15 * those without sh provider support 16 * FUNC/s Functions called, per second 17 * BLTIN/s Builtins called, per second 18 * SUB-SH/s Sub-shells called, per second 19 * CMD/s External commands called, per second 20 * 21 * The numbers are counts for the interval specified. The default interval 22 * is 1 second. 23 * 24 * If you see a count in "EXECS" but not in the other columns, then sh 25 * scripts may be running without the DTrace sh provider. See Shell/Readme. 26 * 27 * Filename and function names are printed if available. 28 * 29 * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. 30 * 31 * CDDL HEADER START 32 * 33 * The contents of this file are subject to the terms of the 34 * Common Development and Distribution License, Version 1.0 only 35 * (the "License"). You may not use this file except in compliance 36 * with the License. 37 * 38 * You can obtain a copy of the license at Docs/cddl1.txt 39 * or http://www.opensolaris.org/os/licensing. 40 * See the License for the specific language governing permissions 41 * and limitations under the License. 42 * 43 * CDDL HEADER END 44 * 45 * 09-Sep-2007 Brendan Gregg Created this. 46 */ 47 48 #pragma D option quiet 49 #pragma D option defaultargs 50 51 inline int SCREEN = 21; 52 53 dtrace:::BEGIN 54 { 55 execs = funcs = builtins = subs = cmds = 0; 56 lines = SCREEN + 1; 57 interval = $1 ? $1 : 1; 58 counts = $2 ? $2 : -1; 59 secs = interval; 60 first = 1; 61 } 62 63 profile:::tick-1sec 64 { 65 secs--; 66 } 67 68 /* 69 * Print Header 70 */ 71 dtrace:::BEGIN, 72 profile:::tick-1sec 73 /first || (secs == 0 && lines > SCREEN)/ 74 { 75 printf("%-20s %8s %8s %8s %8s %8s\n", "TIME", "EXEC/s", "FUNCS/s", 76 "BLTINS/s", "SUB-SH/s", "CMD/s"); 77 lines = 0; 78 first = 0; 79 } 80 81 /* 82 * Tally Data 83 */ 84 proc:::exec-success 85 /execname == "sh"/ 86 { 87 execs++; 88 } 89 90 sh*:::function-entry 91 { 92 funcs++; 93 } 94 95 sh*:::builtin-entry 96 { 97 builtins++; 98 } 99 100 sh*:::subshell-entry 101 /arg0 != 0/ 102 { 103 subs++; 104 } 105 106 sh*:::command-entry 107 { 108 cmds++; 109 } 110 111 /* 112 * Print Output 113 */ 114 profile:::tick-1sec 115 /secs == 0/ 116 { 117 printf("%-20Y %8d %8d %8d %8d %8d\n", walltimestamp, execs / interval, 118 funcs / interval, builtins / interval, subs / interval, 119 cmds / interval); 120 execs = funcs = builtins = subs = cmds = 0; 121 secs = interval; 122 lines++; 123 counts--; 124 } 125 126 /* 127 * End 128 */ 129 profile:::tick-1sec 130 /counts == 0/ 131 { 132 exit(0); 133 } 134