Коллеги,
Я играю с одним лайнером, который я разработал для коробки RHEL 5.4, и у меня он отлично работает:
TOTAL_RAM=`free | grep Mem: | awk '{ print $2 }'`; \
ps axo rss,comm,pid | awk -v total_ram=$TOTAL_RAM \
'{ proc_list[$2] += $1; } END { for (proc in proc_list) \
{ proc_pct = (proc_list[proc]/total_ram)*100;
printf("%d\t%s\t%0.2f%\n", proc_list[proc],proc,proc_pct); }}' \
| sort -n | tail -n 10
Что выводит что-то вроде следующего в моем поле RHEL:
3736 logmon 0.01%
4156 EvMgrC 0.01%
4692 hald 0.01%
5020 ntpd 0.02%
6252 sshd 0.02%
7784 cvd 0.02%
9224 snmpd 0.03%
13068 dsm_sa_datamgr3 0.04%
23320 dsm_om_connsvc3 0.07%
4249864 mysqld 12.90%
Однако на моем срезе Ubuntu 9.04 я получаю следующее:
awk: run time error: not enough arguments passed to printf("%d %s %0.2f%
")
FILENAME="-" FNR=104 NR=104
33248 console-kit-dae 3.17
Я думаю, что это должен быть bash, который что-то борется, но я действительно не делаю ничего, что должно быть который специфичный для bash. Блок RHEL запущен:
# yum info bash | grep -e Version -e Release
Version : 3.2
Release : 24.el5
И коробка Ubuntu:
# apt-cache show bash | grep -e Version
Version: 3.2-5ubuntu1
Я не вникал в это очень глубоко и подумал, что пингую своих товарищей по джонни, чтобы узнать, сталкивались ли вы с этим раньше.
/лук
Что эта команда показывает в каждой системе:
echo $BASH_VERSION
и поскольку сообщение об ошибке создается awk
, что это показывает:
awk --version | head -n 1
В дополнении к Криса предложение по экранированию последнего% в printf
(что можно сделать с помощью обратной косой черты или удвоения знака процента), вероятно, не помешало бы поставить обратную косую черту продолжения строки в конце строки перед printf
.
Все, что я могу сказать, это то, что он отлично работает на моем Ubuntu 9.10. Но ваш 4-й %
sign мне кажется немного странным - как будто он полагается на какое-то не совсем определенное поведение. Разве этого нельзя избежать?
TOTAL_RAM=`free | grep Mem: | awk '{ print $2 }'`; \
ps axo rss,comm,pid | awk -v total_ram=$TOTAL_RAM \
'{ proc_list[$2] += $1; } END { for (proc in proc_list) \
{ proc_pct = (proc_list[proc]/total_ram)*100;
printf("%d\t%s\t%0.2f%%\n", proc_list[proc],proc,proc_pct); }}' \
| sort -n | tail -n 10
Если вы просто ищете процент памяти, вы можете сделать:
top -b -n1
Вы получите дополнительную информацию, но ее легче разбудить. Top позволяет использовать пакетный режим, в котором весь мусор curses не передается другим приложениям.