Observe: Imprima na tela apenas se a saída tiver mudado desde a última saída

Observe: Imprima na tela apenas se a saída tiver mudado desde a última saída

Estou executando um processo e contando o número de threads com

ps huH p <PID_OF_U_PROCESS> | wc -l

Posso executar este tópico watchassim;

watch -n 1 ps huH p <PID_OF_U_PROCESS> | wc -l

Isso exibirá o número de threads que o processo está executando, mas geralmente esse número não muda.

Como posso imprimir o novo número na tela apenas se ele mudou desde a última vez que o comando foi executado?

Por exemplo:

64 65 64 (alguns minutos se passam) 65

Etc.

Responder1

Você poderia simplesmente canalizar para uniq:

while ps -o nlwp= -p "$pid"; do sleep 1; done | uniq

Responder2

watchnão é capaz de fazer isso diretamente. Embora você possa destacar diferenças na saída do comando (via option -d) ou sair quando a saída muda (via option -g) não é possível exibir a saída de mais de uma execução. Mas você pode conseguir isso por meio de outras ferramentas comuns.

Uma das muitas soluções possíveis:

last=""; while true; do cur="$(ps h -o nlwp -p <PID>)"; if ! [ "$cur" = "$last" ]; then last="$cur"; echo "$(date) $cur"; fi; sleep 1; done

Ou mais legível:

last=""
while true
do
    cur="$(ps h -o nlwp -p <PID>)"
    if ! [ "$cur" = "$last" ]
    then
        last="$cur"
        echo "$(date) $cur"
    fi
    sleep 1
done

Explicação: A psopção -o nlwpimprime diretamente o número de threads, então você não precisa chamar wc -l. Você também pode usar $(pidof programname)em vez de <PID>para determinar o ID do processo automaticamente. Também adicionei a data atual, $(date)que me parece útil. Se você não gostar, basta removê-lo.

informação relacionada