Usando "watch" para detectar diferença de valor e gravar em um arquivo

Usando "watch" para detectar diferença de valor e gravar em um arquivo

Estou tentando capturar a causa de um pico intermitente de% de CPU em um servidor com o comando: watch -n .5 "ps aux | sort -rk 3,3 | head -n 2" onde exibe o processo com a maior% CPU a cada 0,5 segundos.

Porém, como é difícil de capturar (o evento é aleatório e não tenho ideia de quanto tempo dura), quero fazer o seguinte: 1. Reduzir o intervalo (para aumentar a chance de capturar o evento) e escrever a saída em um arquivo 2. Como o processo principal geralmente é constante de qualquer maneira, eu gostaria de escrever apenas quando houver uma diferença de valor entre duas saídas sucessivas (como quando ocorre um pico de CPU) para evitar a criação de um arquivo tão grande.

TIA!

Responder1

Esqueça o relógio, isso deveria servir, pelo menos teoricamente:

while true; do
  # I cut the header first with tail
  cat file <(ps aux | tail -n +2 | sort -rk 3,3 | head -n 2) | sort | uniq | sponge file
  # A certain amount of delay
  sleep 0.1
done

O único problema é que como o uso da CPU de cada processo varia ao longo do tempo, e o que você procura é principalmente o uso da CPU, o efeito uniqé muito limitado e ainda é produzida uma grande quantidade de dados. Você pode usar cutpara suprimir as variáveis ​​que não são importantes para você, para que sua variação não aumente o número de pontos de dados produzidos.

informação relacionada