Watch: Imprime somente na tela se a saída tiver mudado desde a última saída

1

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

ps huH p <PID_OF_U_PROCESS> | wc -l

Eu posso rodar esse tópico com watch assim:

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

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

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

Por exemplo:

64 65 64 (alguns minutos passam) 65

Etc.

    
por A.J. Ruckman 04.11.2015 / 14:07

2 respostas

1

Você pode canalizar para uniq :

while ps -o nlwp= -p "$pid"; do sleep 1; done | uniq
    
por 04.11.2015 / 14:49
2

watch não é capaz de fazer isso diretamente. Embora você possa destacar diferenças na saída do comando (via opção -d ) ou sair quando a saída for alterada (via opção -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 ps option -o nlwp imprime diretamente o número de threads, portanto, 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. Eu também adicionei a data atual via $(date) , o que me parece útil. Se você não gostar, basta removê-lo.

    
por 04.11.2015 / 14:33

Tags