Obtenha o uso da CPU em tempo real do processo linux com comando de linha única e como um resultado simples

2

Eu pesquisei em todos os lugares e não encontrei nada sobre isso. Estou tentando criar um pequeno medidor que mostra o uso da CPU de um processo especificado pelo PID.

Eu preciso do comando para imprimir uma resposta simples, daí porque top -p $ pid não é bom. O comando é executado pelo PHP e precisa imprimir a resposta imediatamente.

Algo que está intimamente relacionado com o que eu preciso é

sudo ps -p $pid -o %cpu

Mas depois de testar e pesquisar mais, descobri que isso imprime o uso médio desde o início do processo. Eu preciso do uso em tempo real a partir do momento em que o comando é executado, como mostra no topo.

Isso é possível?

editar ::

$cmd = 'sudo sh -c "top -n1 | awk \'/30100/ {print $9}\'"';
echo exec($cmd);

tentou sem shell

$cmd = "sudo top -n1 | awk '/30100/ {print $9}'";
echo exec($cmd);

ainda não tem resultado, não ecoa nada

    
por Aron H. 09.04.2015 / 18:49

2 respostas

1

Bem, eu começaria com a abordagem ingênua assim:

$ top |grep %pid

No ubuntu 12.04, ele gera a linha para o PID uma vez por atualização de topo:

    username@usrver / $ top |grep 2593
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:25.38 chrome             
 2593 username   20   0 1103m 170m  16m S   28  2.2  67:26.24 chrome             
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:27.15 chrome             
 2593 username   20   0 1103m 170m  16m S   23  2.2  67:27.86 chrome             
 2593 username   20   0 1103m 170m  16m S   25  2.2  67:28.60 chrome

Em seguida, pegue o 10º campo com o awk, embora não precisemos usar o grep aqui. O awk pode regex para o seu PID, depois imprime o valor da CPU:

username@usrver / $ top | awk '/2593/ {print $10}'
25
29
30
32
    
por 10.04.2015 / 09:45
2

Embora a pergunta já tenha sido respondida e aceita, acho que está incompleta. Há alguns pontos faltando na resposta aceita.

  1. Você precisa executar top no modo batch usando -b se estiver executando como um processo filho e quiser obter uma saída significativa. Caso contrário, ele terá uma combinação de caracteres de controle como resultado da execução no modo interativo.

  2. Especifique o número de iterações desejado, usando -n, caso contrário, resultará em iteração infinita e o processo filho nunca será concluído. Você precisa ter pelo menos duas iterações, de modo que o topo tenha um ponto de referência para coletar a diferença, que é o uso real da CPU.

  3. Especifique o intervalo entre as iterações usando -d. Na maioria dos sistemas, o valor padrão é de 3 segundos. Então, se você quiser um uso por segundo, você precisa especificá-lo explicitamente.

Agora, combinando todos os pontos acima, você obtém

top -b -n 2 -d 1

Como temos duas iterações, precisamos considerar apenas a segunda saída. Use o awk para obter a segunda saída, que começa com a string top .

top -b -n 2 -d 1 | awk '/^top/{i++}i==2'

Agora vamos filtrar o PID, digamos 2593 e imprimir a 9ª coluna, que contém o uso da CPU. Considere apenas as linhas de saída que começam com PID.

top -b -n 2 -d 1 | awk '/^top/{i++}i==2' | awk '/^\s*2593/ {print $9}'
    
por 11.08.2015 / 14:18