Bash wonkyness no Ubuntu versus RHEL

4

Companheiros faucadores

Estou brincando com um forro que desenvolvi em uma caixa RHEL 5.4 e funciono perfeitamente:

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

Qual saída é algo como o seguinte na minha caixa de 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%

No entanto, no meu Ubuntu 9.04 eu recebo isso:

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

Eu acho que tem que ser o bash que está criando algo, mas eu realmente não estou fazendo nada que deva ser esse bash específico. A caixa RHEL está em execução:

# yum info bash | grep -e Version -e Release
Version    : 3.2
Release    : 24.el5

E a caixa do Ubuntu:

# apt-cache show bash | grep -e Version
Version: 3.2-5ubuntu1

Eu não mergulhei nisso profundamente, e pensei em fazer um ping para meus colegas johnnys para ver se você já se deparou com isso antes.

/ bow

    
por d34dh0r53 26.03.2010 / 20:50

3 respostas

3

O que esse comando mostra em cada sistema:

echo $BASH_VERSION

e como a mensagem de erro está sendo produzida por awk , o que isso mostra:

awk --version | head -n 1

Além da sugestão de chris para escapar do último% no printf (o que pode ser feito com uma barra invertida ou dobrando o sinal de porcentagem), provavelmente não faria mal colocar um linha invertida de continuação de linha no final da linha antes do printf .

    
por 26.03.2010 / 22:04
2

Tudo o que posso dizer é que funciona perfeitamente no meu Ubuntu 9.10. Mas o seu sinal de 4 % parece um pouco estranho para mim - como se dependesse de algum comportamento não perfeitamente especificado. Não deveria ser escapado?

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
    
por 26.03.2010 / 21:17
0

Se você está apenas procurando por porcentagem de memória, você pode fazer:

top -b -n1

Você receberá algumas informações adicionais, mas é mais fácil perder o controle. A parte superior permite um modo em lote, de forma que todo o lixo das maldições não seja canalizado para outros aplicativos.

    
por 26.03.2010 / 21:38