Como fazer com que o comando ps mostre memória em mb em vez de kb?

11

O comando ps do Linux mostra diferentes usos de memória, como rss, tamanho em kb por padrão. Existe uma maneira de mostrar em mb ou gb como ls -s --human-readablefaz?

balki
fonte
1
A falta de menção em man pssugere para mim que não existe essa opção embutida.
Ulrich Schwarz

Respostas:

20

AFAIK você não pode alcançá-lo simplesmente por pscomando puro com opções. No entanto, você pode usar alguns processadores de texto como awke fazer o que quiser:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

Isso leva o resultado de pse, em seguida, para cada linha, exceto a primeira que substitui a 5ª coluna, que normalmente está em KB, para MB, adicionando o sufixo M.

Você pode criar um alias e armazená-lo no arquivo .bashrc para poder chamá-lo por algo como myps.

A maioria das pessoas está perguntando como preservar o formato ou usar outras unidades e precisão.

Para uma versão simples, você pode usar column -to filtro de saída:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t

No entanto, isso não reconhece espaços na última coluna corretamente. Infelizmente, precisamos lidar com a formatação de texto e preparar nossa própria string de formato no printfformato like.

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'

Explicação:

  • NR==1condição é apenas para a primeira linha (cabeçalho). Estamos usando a saída ps original para determinar onde o COMMAND está iniciando:
    • o=$0 armazena toda a linha não modificada para que possamos usá-la mais tarde
    • a=match($0,$11) localiza a localização do 11º campo (que deve ser onde a coluna COMMAND está começando na saída original)
  • NR>1é para as seguintes linhas (dados). Estamos mudando o quinto campo:
    • $5=int(10*$5/1024)/10"M" altera o valor em megabytes com uma casa decimal e adiciona o sufixo "M".
    • printf exibe todos os campos com sabor de coluna:
      • %-10ssignifica scorda, 1010 caracteres de largura, -alinhamento à esquerda
      • %8ssignifica sstring, 8com 8 caracteres de largura e, por causa disso, nenhuma -saída desse campo está alinhada à direita.
    • substr(o, a)pega a substring da linha original (portanto oarmazenada antes) começando da posição acalculada na condição anterior, para que possamos ter a saída do comando exibida com os espaços preservados.
DevilaN
fonte
3
Modificado para GB e com 2 casas decimais (por exemplo 1.23GB):ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
mahemoff 19/12/18
1
é possível alcançar o mesmo objetivo preservando a psformatação? Tabs são completamente arrancada comawk
Chris
Vejo que você está transmitindo como int, é possível tê-lo decimal como 1,2 milhão?
JavaSheriff 30/08/19
Por que as guias estão ausentes?
Alex78191 03/04
@ Alex78191: Adicionado comando alternativo para formatação com saída em forma de tabela
DevilaN