Você pode canalizar para uniq :
while ps -o nlwp= -p "$pid"; do sleep 1; done | uniq
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.
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.