Tente isso, ele tem algumas correções de bugs e melhorias de velocidade, incluindo:
- não analisando ls
- usando
awk | read
em vez de chamarawk
várias vezes para campos diferentes do mesmo arquivo $ pid / stat - não está usando
cat | grep | awk
, onde apenasawk
fará - pular entradas sem um VMSize.
Observe o comentário sobre VmSize - ele ignora todos os procs que não possuem uma entrada VmSize. Você pode usar outro método para determinar "$ mem" nesses casos, em vez de simplesmente pular.
#!/bin/bash
TOTALMEM=$(awk '/^MemTotal:/ { print $2 }' /proc/meminfo)
for pid in /proc/[0-9]* ; do
PID=$(basename $pid)
cmd=$(cat $pid/cmdline)
# use 'awk | read' to avoid multiple calls to awk
awk '{print $3,$14,$15,$18}' $pid/stat | read state utime stime pr
ttime=$((utime + stime))
# not all procs have a VmSize entry in status
mem=$(awk '/VmSize:/ { print $2 }' $pid/status)
# empty "$mem" causes a syntax error in bc
if [ -n "$mem" ] ; then
memp=$(echo "scale=2;$TOTALMEM / $mem" | bc -l)
memp="$memp%"
mem=$(echo "scale=2;$mem / 1024" | bc -l)
cpu=$ttime
usr=$(stat -c '%U' $pid)
process_string="$PID $usr $pr $mem $state $cpu $memp $ttime $cmd"
echo $process_string
fi
done