Назад | Перейти на главную страницу

Беспокойство Bash на Ubuntu против RHEL

Коллеги,

Я играю с одним лайнером, который я разработал для коробки 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 не передается другим приложениям.