| #!/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$$ | 
 |  |