Existe uma maneira de obter o "top" para executar exatamente uma vez e sair?

13

Acho que a saída do comando shell topé uma maneira simples e familiar de obter uma idéia aproximada da saúde de uma máquina. Eu gostaria de servir topa saída (ou algo muito semelhante a ela) de um pequeno servidor Web em uma máquina para fins de monitoramento bruto.

Existe uma maneira de obter o máximo para escrever sua saída de texto exatamente uma vez , sem formatar caracteres? Eu tentei isso:

(sleep 1; echo 'q') | top > output.txt

Isso parece estar perto do que eu quero, exceto que (1) não há garantia de que não receberei mais ou menos que uma tela cheia de informações e (2) eu tenho que remover todos os caracteres de formatação do terminal.

Ou existe algum outro topcomando semelhante que lista informações de memória / uso de CPU / uptime em toda a máquina e em nível de processo?

(Idealmente, eu adoraria uma estratégia que seja portátil para Linux e Mac OS X, já que nossos desenvolvedores usam Macs e nosso ambiente de produção é o Linux.)

Mickalot
fonte

Respostas:

22

No Linux, você pode tentar o seguinte:

top -bn1 > output.txt

De man top:

-b : Batch-mode operation
            Starts top in 'Batch' mode, which could be useful for sending
            output from top to other programs or  to  a  file.   In  this
            mode, top will not accept input and runs until the iterations
            limit you've set with the '-n' command-line option  or  until
            killed.
....
-n : Number-of-iterations limit as:  -n number
            Specifies  the  maximum  number of iterations, or frames, top
            should produce before ending.

Com o OS X, tente:

top -l 1

Da página principal do OSX :

 -l <samples>
              Use logging mode and display <samples> samples, even if 
              standard output is a terminal. 0 is treated  as  infinity.   
              Rather than redisplaying, output is periodically printed in 
              raw form. Note that the first sample displayed will have an 
              invalid %CPU displayed for each process,  as it is calculated 
              using the delta between samples.
cuonglm
fonte
Parece exatamente a resposta que eu procuraria se topno OS X suportasse o sinalizador -b. :-( Infelizmente, isso não acontece, e eu não ver uma versão topdisponível através homebrew Esta parece ser exatamente a resposta certa para Linux, tho..
Mickalot
@Mickalot: Veja o meu atualizado. Você pode instalar o GNU top no Mac OSX?
3051414 cuonglm
@Gnuoc: /usr/bin/top -l 1no OSX 10.9.4 é perfeito ... obrigado! Quanto à instalação do GNU top, eu poderia instalá-lo na minha máquina, mas teria que convencer os outros desenvolvedores a instalá-lo em suas máquinas para que meu código funcionasse para eles, então prefiro evitar isso. (Se não estiver disponível através do homebrew, haverá resistência.) Agora que mudarei com base na plataforma, serei ganancioso ... você conhece algum semi-equivalente do Windows para esses desenvolvedores (temos alguns) também pode ter uma página de status bruta? (Caso contrário, tudo bem, sua resposta já é super útil!) #
Mickalot
@Mickalot: Lembre-se da observação da página principal do OSX. Observe que a primeira amostra exibida terá uma% de CPU inválida exibida para cada processo, pois é calculada usando o delta entre as amostras. . Com os usuários do Windows, talvez você possa usar o `` cygwin` '
cuonglm
@Gnuoc Obrigado pelo ponto extra. Suponho que posso fazer top -l 2e jogar fora a primeira página de amostras?
Mickalot
1

Para obter números de tipo semelhantes em um sistema Windows, consulte o PowerShell.

Apenas para obter uma lista dos processos que você vê get-process. Dê uma olhada nesta referência .

Ao fazer algumas pesquisas adicionais, encontrei um pequeno comando aqui .

Que, se você retirar o loop while, para as suas necessidades seria:

ps | sort -desc cpu | select -first 30

psno powershell é um apelido para get-process.

Yuppers
fonte
Parece uma ótima ideia! Vou pedir a um dos meus colegas de trabalho para testar o Windows ...
Mickalot