1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
#compdef top
local curcontext="$curcontext" state state_descr line ret=1
local -A opt_args
local -a specs fields order opts
opts=( -s -w -C )
case $OSTYPE in
*linux*)
# based on procps-ng-3.3.15
fields=(
'%CPU:CPU usage' '%MEM:memory usage (res)' 'CGROUPS:control groups'
'CODE:code size' 'COMMAND:Command name/line' 'DATA:data + stack size'
'ENVIRON:environment variables' 'Flags:task flags' 'GID:group id'
'GROUP:group name' 'NI:nice value' 'P:last used CPU (SMP)'
'PGRP:process group id' 'PID:process id' 'PPID:parent pid' 'PR:priority'
'RES:resident memory size' 'RUID:real user id' 'RUSER:real uid'
'S:process status' 'SHR:shared memory size' 'SID:session id'
'SUID:saved uid' 'SUPGIDS:supplementary gids'
'SUPGRPS:supplementary group names' 'SUSER:saved username'
'SWAP:swapped sized' 'TGID:thread gid' 'TIME:CPU time'
'TIME+:CPU time (hundredths)' 'TPGID:TTY gid' 'TTY:controlling TTY'
'UID:user id' 'USED:memory in use' 'USER:user name'
'VIRT:virtual memory size' 'WCHAN:sleeping in function'
'nDRT:dirty pages count' 'nMaj:major page count' 'nMin:minor page count'
'nTH:number of threads' 'nsIPC:IPC namespace' 'nsMNT:MNT namespace'
'nsNET:NET namespace' 'nsPID:PID namespace' 'nsUSER:USER namespace'
'nsUTS:UTS namespace' 'vMj:major page fault count delta'
'vMn:minor page fault count delta' 'LXC:lxc container name'
'OOMa:out of memory adjustment factor' 'OOMs:out of memory source'
'Rsan:resident anonymous memory size'
'RSfd:resident file-backed memory size' 'RSlk:resident locked memory size'
'RSsh:resident shared memory size' 'CGNAME:control group name'
'NU:last known NUMA node'
)
order=( '+:descending (default)' '-:ascending' )
local -a units=( 'k:KiB' 'm:MiB' 'g:GiB' 't:TiB' 'p:PiB' 'e:EiB' )
specs=(
'(-)-'{h,v}'[show version and usage]'
'-b[batch mode]'
'-c[command line/program name toggle]'
'-d+[delay time interval]:interval'
'-E+[specify the memory scaling unit]: : _describe -V -t units unit units'
'-H[threads mode operation]'
'-i[idle process toggle]'
'-n+[number of iterations]:number of iterations'
'-o+[override sort field]:fieldname:->sortkey'
'-O[output field names]'
'(-u -U)*-p+[monitor pids]: :_sequence -s , _pids'
'-s[secure mode operation]'
'-S[cumulative time toggle]'
'(-U -p)-u+[effective user filter mode]: :_users'
'(-u -p)-U+[user filter mode]: :_users'
'-w+[output width override]::number'
'-1[single/separate cpu states toggle]'
);;
freebsd*|openbsd*)
fields=( cpu size res time pri pid )
specs=(
'-b[batch mode]'
'-d+[show only specified number of displays then exit]:count:'
'-H[display individual threads]'
'-I[do not display idle processes]'
'-i[interactive mode]'
'-n[non-interactive mode (identical to batch mode)]'
'-p+[filter by the specified pid]: :_pids'
'-q[renice top to -20]'
'-S[show system processes]'
'-s+[specify delay interval]:seconds:'
'-u[do not translate uid to name]'
'1: :_guard "^-*" "number of processes to display"'
);|
freebsd*)
fields+=( threads total read write fault vcsw ivcsw jid swap )
specs+=(
'-C[CPU display mode]'
'-a[display command names via argv]'
'-j[display the jail ID]'
'-t[do not display the top process]'
'-m+[specify statistic type]:type:(( cpu\:default io ))'
'-o+[sort process display by the specified field]:field:( $fields )'
'-P[per-cpu CPU usage statistics]'
'(1 -)-v[write version number and exit]'
'-w[display approximate swap usage]'
"-z[don't display system idle process]"
'-J+[show processes owned by the specified jail]:jail:_jails -0'
'-U+[show processes owned by the specified username]: :_users'
);;
openbsd*)
fields+=( command )
order=( '-:reverse order' )
specs+=(
'-1[combine CPU statistic into one line]'
'-t[show the routing table instead of the wait channel]'
'-C[show command arguments as well as process name]'
'-g+[filter processes by the specified string]:string'
'-o+[sort process display by the specified field]:field:->sortkey'
'-T+[filter processes by the specified routing table]:routing table:_routing_tables'
'-U+[filter processes by the specified user]: :_users -M "L\:|-="'
);;
darwin*)
local -a modes
opts=( -C ) # no option stacking
modes=(
'a:count events cumulatively'
'd:count events relative to the previous sample'
'e:count events using absolute counters'
'n:non-event mode (default)'
)
fields=(
'pid:process id'
'command:command name'
'cpu:CPU usage'
'cpu_me:CPU time charged to me by other processes'
'cpu_others:CPU time charged to other processes by me'
'csw:number of context switches'
'time:execution time'
{threads,th}':number of threads'
{ports,prt}':number of Mach ports'
{mregion,mreg,reg}':number of memory regions'
'mem:internal memory size'
'rprvt:resident private address space size'
'purg:purgeable memory size'
'vsize:total memory size'
'vprvt:private address space size'
'kprvt:private kernel memory size'
'kshrd:shared kernel memory size'
'pgrp:process group id'
'ppid:parent process id'
{state,pstate}':process state'
'uid:user id'
{wq,'#wq',workqueue}':workqueue total/running'
{faults,fault}':number of page faults'
{cow,cow_faults}':copy-on-write faults'
{user,username}':username'
'msgsent:total number of Mach messages sent'
'msgrecv:total number of Mach messages received'
'sysbsd:total BSD syscalls'
'sysmach:total Mach syscalls'
'pageins:total pageins'
'boosts:number of boosts held by the process'
'instrs:number of instructions retired by the process'
'cycles:number of cycles spent in the process'
)
order=( '-:descending (default)' '+:ascending' )
specs=(
'-a[count events cumulatively]'
'-c[set event counting mode]:mode:(( $modes ))'
'-d[count events relative to the previous sample]'
'-e[count events using absolute counters]'
'-F[do not calculate statistics on shared libraries]'
'-f[calculate statistics on shared libraries]'
'(-)-h[print usage information and exit]'
'-i+[specify interval between samples for -f option]:interval'
'-l+[logging mode. output specified number of samples periodically]:number of samples'
'-ncols[output specified number of columns in logging mode]:number of columns'
'-n+[only display up to the specified number of processes]:number of processes:'
'-O+[specify the secondary sort key]:key:->sortkey'
'-o+[specify the primary sort key]:key:->sortkey'
'-R[do not traverse and report memory object map for each process]'
'-r[traverse and report memory object map for each process]'
'-S[display global statistics for swap and purgeable memory]'
'-s[set the delay between update]:number of seconds'
'-stats[only display the specified fields]:list of fields:->fieldlist'
'*-pid[only display the specified process]:pid:_pids'
{-user,-U+}'[only display processes owned by the specified user]:user:_users'
'-u[same as -o cpu -O time]'
);;
esac
if (( $#specs == 0 )); then
_default
return
fi
_arguments $opts : "$specs[@]" && ret=0
case $state in
(sortkey)
compset -P '(+|-)' && order=()
_alternative 'sort-orders:sort order:(( $order ))' \
'sort-keys:sort key:(( $fields ))' && ret=0
;;
(fieldlist)
_sequence -s , _describe -t fields 'field' fields && ret=0
;;
esac
return ret
|