Commit | Line | Data |
---|---|---|
77bd540c SK |
1 | #! /bin/sh |
2 | ||
3 | usage() { | |
4 | echo "EXAMPLE (whole tree) : $0 | neato -T png > ps.png && open ps.png" | |
5 | echo "EXAMPLE (user clusters): $0 | sdp -T png > ps.png && open ps.png" | |
6 | } | |
7 | ||
8 | ||
9 | compile() { | |
10 | awk -v kernel="$(uname -v)" -v whoami="$(whoami)" \ | |
11 | ' | |
12 | BEGIN { | |
13 | p2cmd[0] = "swapper/sched" | |
14 | color_base = 20 | |
15 | color_incr = 30 | |
16 | color_hi = sprintf("grey%d", (color_base + (color_incr * 0))) | |
17 | color_mid = sprintf("grey%d", (color_base + (color_incr * 1))) | |
18 | color_low = sprintf("grey%d", (color_base + (color_incr * 2))) | |
19 | } | |
20 | ||
21 | NR > 1 { | |
22 | p2pp[$1]=$2; | |
23 | p2user_id[$1]=$3 | |
24 | p2user_name[$1]=$4 | |
25 | p2cmd[$1]=$5 | |
26 | user_names[$4]=1 | |
27 | } | |
28 | ||
29 | END { | |
30 | print "strict digraph G {"; | |
31 | ||
32 | print "start=0;"; | |
33 | print "colorscheme=brewer;"; | |
34 | print "fontsize=8;"; | |
35 | print "fontname=Helvetica;"; | |
36 | print "label=\"" kernel "\";"; | |
37 | ||
38 | printf(\ | |
39 | "edge [ fontsize=8 \ | |
40 | , fontname=Helvetica \ | |
41 | , len=2.0 \ | |
42 | , color=%s \ | |
43 | ];", | |
44 | color_low\ | |
45 | ) | |
46 | ||
47 | print "node [ fontsize=8 \ | |
48 | , fontname=Helvetica \ | |
49 | , shape=ellipse \ | |
50 | ]; \ | |
51 | "; | |
52 | ||
53 | ##### Vertices (clustered by user) | |
54 | for (user in user_names) { | |
55 | printf "subgraph \"cluster_%s\" {\n", user | |
56 | printf "label=\"%s\"\n", user | |
57 | for (p in p2pp) { | |
58 | if (p2user_name[p] == user) { | |
59 | color = p2user_name[p] == whoami ? color_hi : color_low | |
60 | fontcolor = p2user_name[p] == whoami ? color_hi : color_mid | |
61 | printf(\ | |
62 | "\"%d\"\ | |
63 | [ fontsize=8 \ | |
64 | , fontname=Helvetica \ | |
65 | , shape=ellipse \ | |
66 | , label=\"%s\n%d\" \ | |
67 | , color=\"%s\" \ | |
68 | , fontcolor=\"%s\" \ | |
69 | ];", | |
70 | p, | |
71 | p2cmd[p], | |
72 | p, | |
73 | color, | |
74 | fontcolor\ | |
75 | ) | |
76 | } | |
77 | } | |
78 | print "}" | |
79 | } | |
80 | ||
81 | ##### Vertices (without a user) | |
82 | for (p in p2cmd) { | |
83 | if (!p2user_name[p]) { | |
84 | printf(\ | |
85 | "\"%d\"\ | |
86 | [ fontsize=8 \ | |
87 | , fontname=Helvetica \ | |
88 | , shape=ellipse \ | |
89 | , label=\"%s\n%d\" \ | |
90 | , color=\"%s\" \ | |
91 | , fontcolor=\"%s\" \ | |
92 | ];", | |
93 | p, | |
94 | p2cmd[p], | |
95 | p, | |
96 | color_low, | |
97 | color_mid\ | |
98 | ) | |
99 | } | |
100 | } | |
101 | ||
102 | ##### Edges (across clusters) | |
103 | for (p in p2pp) { | |
104 | printf "\"%d\" -> \"%d\";\n", p2pp[p], p, p | |
105 | } | |
106 | ||
107 | print "}"; | |
108 | } | |
109 | ' | |
110 | } | |
111 | ||
112 | ||
113 | procs() { | |
114 | if [ "$(uname)" = 'Linux' ]; then | |
115 | ps -eo pid,ppid,euid,euser,comm | |
116 | else | |
117 | ps -eco pid,ppid,euid,euser,comm | |
118 | fi | |
119 | } | |
120 | ||
121 | ||
122 | main() { | |
123 | case "$1" in | |
124 | '--help') usage | |
125 | ;; | |
126 | *) procs | grep "$1" | compile | |
127 | ;; | |
128 | esac | |
129 | } | |
130 | ||
131 | ||
132 | main "$1" |