iptree - plstree - ps and ls displayed as a tree Err bitreich.org 70 hgit clone git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/plstree URL:git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/plstree bitreich.org 70 1Log /scm/plstree/log.gph bitreich.org 70 1Files /scm/plstree/files.gph bitreich.org 70 1Refs /scm/plstree/refs.gph bitreich.org 70 1Tags /scm/plstree/tag bitreich.org 70 1README /scm/plstree/file/README.gph bitreich.org 70 i--- Err bitreich.org 70 iptree (3515B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #!/usr/bin/awk -f Err bitreich.org 70 i 2 Err bitreich.org 70 i 3 # pstree implementation in awk Err bitreich.org 70 i 4 Err bitreich.org 70 i 5 # Use ps(1) to generate a list of pid, ppid and other properties with Err bitreich.org 70 i 6 # the command name, displayed as a tree built from the pid-ppid pairs: Err bitreich.org 70 i 7 # Err bitreich.org 70 i 8 # USER TT NI PID STAT COMMAND Err bitreich.org 70 i 9 # root ? 0 1 Ss runit Err bitreich.org 70 i 10 # josuah ? 0 22437 S ├─ startx Err bitreich.org 70 i 11 # josuah ? 0 22451 S │ └─ xinit Err bitreich.org 70 i 12 # root tty7 0 22452 Rsl+ │ ├─ Xorg Err bitreich.org 70 i 13 # josuah ? 0 22457 S │ └─ dwm Err bitreich.org 70 i 14 # josuah ? 0 24882 S └─ runsvdir Err bitreich.org 70 i 15 # josuah ? 0 24884 S ├─ runsv Err bitreich.org 70 i 16 # josuah ? 0 24887 S │ ├─ svlogd Err bitreich.org 70 i 17 # josuah ? 0 24890 S │ └─ ratox Err bitreich.org 70 i 18 # josuah ? 0 24885 S └─ runsv Err bitreich.org 70 i 19 # josuah ? 0 24405 S ├─ tor Err bitreich.org 70 i 20 # josuah ? 0 24889 S └─ svlogd Err bitreich.org 70 i 21 Err bitreich.org 70 i 22 BEGIN { Err bitreich.org 70 i 23 LINE = "│ "; Err bitreich.org 70 i 24 NODE = "├─ "; Err bitreich.org 70 i 25 TAIL = "└─ "; Err bitreich.org 70 i 26 VOID = " "; Err bitreich.org 70 i 27 Err bitreich.org 70 i 28 list(entries); Err bitreich.org 70 i 29 NUM = 1; fill(entries, 1, 0); Err bitreich.org 70 i 30 tree(entries, NUM); Err bitreich.org 70 i 31 Err bitreich.org 70 i 32 for (i = 1; i < NUM; i++) { Err bitreich.org 70 i 33 printf("%s", entries[i":info"]); Err bitreich.org 70 i 34 for (j = 1; entries[i":"j] != ""; j++) Err bitreich.org 70 i 35 printf("%s", entries[i":"j]); Err bitreich.org 70 i 36 printf("%-" 30 - j * 3 "s", entries[i":comm"]); Err bitreich.org 70 i 37 print(entries[i":args"]); Err bitreich.org 70 i 38 } Err bitreich.org 70 i 39 } Err bitreich.org 70 i 40 Err bitreich.org 70 i 41 # Build a relational database in from the output of ps: The Err bitreich.org 70 i 42 # parent pid (ppid) -> pid pairs are used to accumulate a list of child Err bitreich.org 70 i 43 # pid (serialized into a csv: ",234,532,454") later used for building Err bitreich.org 70 i 44 # the tree. Err bitreich.org 70 i 45 # Err bitreich.org 70 i 46 # For each pid, "info" and "comm" are saved as well. Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 function list(entries) Err bitreich.org 70 i 49 { Err bitreich.org 70 i 50 opt = "-o ppid,user,vsz,pid,stat,comm,args" Err bitreich.org 70 i 51 cmd = "exec ps -ax " opt " 2>/dev/null"; Err bitreich.org 70 i 52 if (!(cmd | getline)) { Err bitreich.org 70 i 53 cmd = "exec ps " opt Err bitreich.org 70 i 54 cmd | getline; Err bitreich.org 70 i 55 } Err bitreich.org 70 i 56 sub(" *[^ ]+", ""); Err bitreich.org 70 i 57 print $0; Err bitreich.org 70 i 58 Err bitreich.org 70 i 59 for (num = 0; cmd | getline; num++) { Err bitreich.org 70 i 60 ppid = $1; pid = $4; Err bitreich.org 70 i 61 entries[ppid"cpid"] = entries[ppid"cpid"] "," pid; Err bitreich.org 70 i 62 sub(" *[^ ]+", ""); Err bitreich.org 70 i 63 sub(" *[^ ]+ + *[^ ]+ + *[^ ]+ + *[^ ]+ +", "&\t"); Err bitreich.org 70 i 64 sub("[^\t]+ [^ ]+ +", "&\t"); Err bitreich.org 70 i 65 split($0, info, "\t"); Err bitreich.org 70 i 66 sub(" *$" , "", info[2]); Err bitreich.org 70 i 67 entries[pid"info"] = info[1]; Err bitreich.org 70 i 68 entries[pid"comm"] = info[2]; Err bitreich.org 70 i 69 entries[pid"args"] = info[3]; Err bitreich.org 70 i 70 } Err bitreich.org 70 i 71 close(cmd); Err bitreich.org 70 i 72 Err bitreich.org 70 i 73 return num - 1; Err bitreich.org 70 i 74 } Err bitreich.org 70 i 75 Err bitreich.org 70 i 76 # Using the informations from the child pid in entries, build the absolute Err bitreich.org 70 i 77 # path from PID 1 to each pid: Err bitreich.org 70 i 78 # Err bitreich.org 70 i 79 # [ 1:[ 1:"1" ], Err bitreich.org 70 i 80 # 2:[ 1:"1", 2:"456" ], Err bitreich.org 70 i 81 # 3:[ 1:"1", 2:"456", 3:"1623" ], Err bitreich.org 70 i 82 # 4:[ 1:"1", 2:"456", 3:"1721" ] ] Err bitreich.org 70 i 83 # Err bitreich.org 70 i 84 # With also ":info" and ":comm" for every row. Err bitreich.org 70 i 85 # Err bitreich.org 70 i 86 # Only the leaves are present, the intermediates components are LINE or Err bitreich.org 70 i 87 # NODE if just before a leave Err bitreich.org 70 i 88 # Err bitreich.org 70 i 89 # [ 1:[ 1:LINE, 2:LINE, 3:LINE, 4:LINE, 5:NODE, 6:"filename" ] ] Err bitreich.org 70 i 90 Err bitreich.org 70 i 91 function fill(entries, pid, lvl) Err bitreich.org 70 i 92 { Err bitreich.org 70 i 93 for (j = 0; j < lvl; j++) Err bitreich.org 70 i 94 entries[NUM":"j] = LINE; Err bitreich.org 70 i 95 entries[NUM":"lvl] = NODE; Err bitreich.org 70 i 96 entries[NUM":comm"] = entries[pid"comm"]; Err bitreich.org 70 i 97 entries[NUM":args"] = entries[pid"args"]; Err bitreich.org 70 i 98 entries[NUM":info"] = entries[pid"info"]; Err bitreich.org 70 i 99 NUM++; Err bitreich.org 70 i 100 while (sub("[^,]*,", "", entries[pid"cpid"])) { Err bitreich.org 70 i 101 cpid = entries[pid"cpid"]; Err bitreich.org 70 i 102 sub(",.*", "", cpid); Err bitreich.org 70 i 103 fill(entries, cpid, lvl + 1); Err bitreich.org 70 i 104 } Err bitreich.org 70 i 105 } Err bitreich.org 70 i 106 Err bitreich.org 70 i 107 # Transform entries into a tree by replacing some LINE by VOID when needed. Err bitreich.org 70 i 108 # The tree is walked from the bottom to the top, and column by column Err bitreich.org 70 i 109 # toward the right until an empty column is met. Err bitreich.org 70 i 110 Err bitreich.org 70 i 111 function tree(entries, num) Err bitreich.org 70 i 112 { Err bitreich.org 70 i 113 for (j = 0; !stop; j++) { Err bitreich.org 70 i 114 stop = tail = 1; Err bitreich.org 70 i 115 for (i = num; i > 0; i--) { Err bitreich.org 70 i 116 if (entries[i":"j] == LINE && tail) { Err bitreich.org 70 i 117 entries[i":"j] = VOID; Err bitreich.org 70 i 118 stop = 0; Err bitreich.org 70 i 119 } else if (entries[i":"j] == NODE && tail) { Err bitreich.org 70 i 120 entries[i":"j] = TAIL; Err bitreich.org 70 i 121 tail = stop = 0; Err bitreich.org 70 i 122 } else if (!entries[i":"j]) { Err bitreich.org 70 i 123 tail = 1; Err bitreich.org 70 i 124 } Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 } Err bitreich.org 70 i 127 } Err bitreich.org 70 .