Add (updated) ps2dot
[khome.git] / home / bin / ps2dot
CommitLineData
77bd540c
SK
1#! /bin/sh
2
3usage() {
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
9compile() {
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
113procs() {
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
122main() {
123 case "$1" in
124 '--help') usage
125 ;;
126 *) procs | grep "$1" | compile
127 ;;
128 esac
129}
130
131
132main "$1"
This page took 0.037325 seconds and 4 git commands to generate.