|  | #!/bin/sh | 
|  |  | 
|  | I_WANT_A_BROKEN_PS=yes | 
|  | export I_WANT_A_BROKEN_PS | 
|  | all=no | 
|  | if [ "x$1" = "x-a" ] | 
|  | then | 
|  | all=yes | 
|  | fi | 
|  | export all | 
|  |  | 
|  | cat >/tmp/awk.xxx$$ <<'!' | 
|  | BEGIN{ | 
|  | state["D"] = "Spinwait"; | 
|  | state["I"] = "Idle"; | 
|  | state["J"] = "Jail"; | 
|  | state["R"] = "Ready"; | 
|  | state["O"] = "Running"; | 
|  | state["S"] = "Sleep"; | 
|  | state["T"] = "Stopped"; | 
|  | state["Z"] = "Zombie"; | 
|  | state["W"] = "Fault"; | 
|  | state["X"] = "Moribund"; | 
|  | } | 
|  |  | 
|  | function statestr(s, wchan) | 
|  | { | 
|  | if(wchan != s && wchan != "?" && wchan != "-") | 
|  | return wchan; | 
|  | t = state[substr(s, 1, 1)]; | 
|  | if(t == "") | 
|  | return s; | 
|  | return t; | 
|  | } | 
|  |  | 
|  | # rsc  36706   starttime 0:00.17  1076 Is+  -bash (bash) | 
|  | { | 
|  | i=1 | 
|  | user=$i; i++ | 
|  | pid=$i; i++ | 
|  | start=$i; i++ | 
|  | if(start ~ /^[A-Z][a-z][a-z]$/){ | 
|  | start = start "-" $i; i++ | 
|  | } | 
|  | cputime=$i; i++ | 
|  | mem=$i; i++ | 
|  | stat=$i; i++ | 
|  | wchan=$i; i++ | 
|  | cmd=$i; i++ | 
|  | if(ENVIRON["all"] == "yes"){ | 
|  | for(; i<=NF; i++) | 
|  | cmd = cmd " " $i; | 
|  | }else{ | 
|  | sub(/.*\//, "", cmd); | 
|  | sub(/:$/, "", cmd); | 
|  | sub(/^-/, "", cmd); | 
|  | s = " " cmd; | 
|  | } | 
|  | sub(/\.[0-9][0-9]$/, "", cputime);	# drop .hundredths of second | 
|  | if(cputime ~ /..:..:../){	# convert hh:mm:ss into mm:ss | 
|  | split(cputime, a, ":"); | 
|  | cputime = sprintf("%d:%02d", a[1]*60+a[2], a[3]); | 
|  | } | 
|  | if(start ~ /..:..:../){	# drop :ss | 
|  | sub(/:..$/, "", start); | 
|  | } | 
|  | sub(/[ 	]+$/, "", cmd); | 
|  | line[0+nline++] = sprintf("%s\001%d\001%s\001%s\001%dK\001%s\001%s", | 
|  | user, pid, start, cputime, mem, statestr(stat, wchan), cmd); | 
|  | } | 
|  |  | 
|  | END{ | 
|  | for(i=0; i<nline; i++){ | 
|  | split(line[i], a, "\001"); | 
|  | for(j=1; j<=7; j++) | 
|  | if(length(a[j]) > max[j]) | 
|  | max[j] = length(a[j]); | 
|  | } | 
|  | for(i=0; i<nline; i++){ | 
|  | split(line[i], a, "\001"); | 
|  | printf("%-*s %*s %*s %*s %*s %-*s %s\n", | 
|  | max[1], a[1], max[2], a[2], max[3], a[3], max[4], a[4], | 
|  | max[5], a[5], max[6], a[6], a[7]); | 
|  | } | 
|  | } | 
|  | ! | 
|  |  | 
|  | case "${SYSNAME:-`uname`}" in | 
|  | SunOS) | 
|  | /bin/ps -aA -o 'user,pid,stime,time,rss,s,s,args' | sed 1d | | 
|  | nawk -f /tmp/awk.xxx$$ | sort -n +1 | 
|  | ;; | 
|  | *) | 
|  | /bin/ps -axww -o 'user,pid,start,time,rss,stat,wchan,command' | sed 1d | | 
|  | awk -f /tmp/awk.xxx$$ | sort -n +1 | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | rm -f /tmp/awk.xxx$$ | 
|  |  |