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.