xref: /freebsd/cddl/usr.sbin/dwatch/libexec/systop (revision 7ef62cebc2f965b0f640263e179276928885e33d)
1# -*- tab-width: 4 -*- ;; Emacs
2# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
3############################################################ IDENT(1)
4#
5# $Title: dwatch(8) profile for top-like syscall $
6# $Copyright: 2014-2018 Devin Teske. All rights reserved. $
7# $FreeBSD$
8#
9############################################################ DESCRIPTION
10#
11# Every 3 seconds update the screen with syscall consumers.
12#
13############################################################ PRAGMAS
14
15# Optional: You can override the default pragmas (shown below)
16
17DTRACE_PRAGMA="
18	option quiet
19	option aggsortrev
20" # END-QUOTE
21
22############################################################ PROBE
23
24: ${PROBE:=profile:::tick-3s}
25
26############################################################ ACTIONS
27
28exec 9<<EOF
29BEGIN { printf("Sampling ...") } /* probe ID $ID */
30
31syscall:::entry /* probe ID $(( $ID + 1 )) */
32{
33	@num[probefunc,execname] = count();
34}
35
36END { trunc(@num) } /* probe ID $(( $ID + 2 )) */
37EOF
38ACTIONS=$( cat <&9 )
39ID=$(( $ID + 3 ))
40
41############################################################ EVENT TAG
42
43# The EVENT_TAG is run inside the print action after the timestamp has been
44# printed. By default, `UID.GID CMD[PID]: ' of the process is printed.
45#
46# Here we override the default EVENT_TAG to include ANSI cursor-homing and
47# screen-clearing codes.
48
49size=$( stty size 2> /dev/null )
50rows="${size%% *}"
51cols="${size#* }"
52
53exec 9<<EOF
54	printf("\033[H"); /* Position the cursor at top-left */
55	printf("\033[J"); /* Clear display from cursor to end */
56
57	/* Header line containing probe (left) and date (right) */
58	printf("%-*s%s%Y%s\n",
59		$(( ${cols:-80} - 20 )), "$PROBE",
60		console ? "\033[32m" : "",
61		walltimestamp,
62		console ? "\033[39m" : "");
63
64	/* Column headers */
65	printf("%s%8s %-20s %s%s\n",
66		console ? "\033[1m" : "",
67		"COUNT",
68		"SYSCALL",
69		"EXECNAME",
70		console ? "\033[22m" : "");
71EOF
72EVENT_TAG=$( cat <&9 )
73
74############################################################ EVENT DETAILS
75
76exec 9<<EOF
77	printa("%@8u %-20s %s\n", @num);
78	trunc(@num);
79EOF
80EVENT_DETAILS=$( cat <&9 )
81
82################################################################################
83# END
84################################################################################
85