Bash: extrai dados de um programa de linha de comando

0

Eu sei como obter a memória total no sistema:

$ free -lm
             total       used       free     shared    
Mem:          3008       2495        513         57

Eu sei como obter o consumo de memória principal (RSS) dos processos de trabalho no Nginx:

$ ps -C nginx -O rss
  PID   RSS S TTY          TIME COMMAND
 1564  1336 S ?        00:00:00 nginx: master process /usr/sbin/nginx
 1565  1756 S ?        00:00:00 nginx: worker process
 1566  1756 S ?        00:00:00 nginx: worker process
 1567  1756 S ?        00:00:00 nginx: worker process
 1568  1756 S ?        00:00:00 nginx: worker process

Agora, para determinar quantos processos de trabalho meu sistema pode usar sem recorrer à troca:

echo $((3008 * 1024))
3080192
$ echo $((3080192 / 1756))
1754

Meu servidor pode manipular os funcionários do 1754 nginx sem recorrer a swap. No entanto, seria ótimo se eu pudesse pegar este processo multi-passo acima e torná-lo uma única linha que pode ser executada a partir da linha de comando.

Meu problema é que eu não sei como extrair o "3008" do comando free da linha de comando. Como posso resolver isso?

    
por Donato 08.10.2016 / 18:51

4 respostas

1

My problem is I don't know how to extract that "3008" from the free command from the command line

Dado este resultado:

free -lm
             total       used       free     shared    buffers     cached
Mem:          3757       1765       1991        138        122        766
Low:          3757       1765       1991
High:            0          0          0
-/+ buffers/cache:        876       2880
Swap:         7772          0       7772


Tente isto:

free -lm | grep '^Mem' | awk '{ print $2 }'
3757

Que retornará a coluna total na linha Mem: . No meu caso 3757 .

    
por 08.10.2016 / 18:58
1

Piping grátis para o awk irá extrair o valor que você precisa:

free -l | awk '/^Mem/{print $2}'

    
por 08.10.2016 / 20:56
0

Algo como:

echo $ (($ (($ (free-lm | grep Mem | awk '{print $ 2}') * 1024)) / $ (psn nginx -o rss | grep 'nginx: processo de trabalho $' | awk '{print $ 2}' | tail -1)))

    
por 08.10.2016 / 18:58
0

Você deve conseguir fazer isso com a cabeça, cauda e corte:

free -lm | head -2 | tail -1 | tr -s ' ' | cut -f2 -d' '

head -2 porque são as duas principais linhas.

             total       used       free     shared    buffers     cached
Mem:          3757       1765       1991        138        122        766

tail -1 porque é a última linha disso.

Mem:          3757       1765       1991        138        122        766

tr -s ' ' - converte cadeias de espaço em branco em um único espaço.

Mem: 3757 1765 1991 138 122 766

Finalmente - cut -f2 -d' ' - obtendo o segundo campo, delimitado por espaço.

3757
    
por 08.10.2016 / 20:09

Tags