Observar: Imprima solo en la pantalla si la salida ha cambiado desde la última salida

Observar: Imprima solo en la pantalla si la salida ha cambiado desde la última salida

Estoy ejecutando un proceso y estoy contando el número de hilos con

ps huH p <PID_OF_U_PROCESS> | wc -l

Puedo ejecutar este hilo watchasí;

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

Esto generará la cantidad de subprocesos que el proceso está ejecutando, pero generalmente ese número no cambia.

¿Cómo puedo imprimir solo el nuevo número en la pantalla si cambió desde la última vez que se ejecutó el comando?

Por ejemplo:

64 65 64 (pasan unos minutos) 65

Etc.

Respuesta1

Podrías simplemente conectarte a uniq:

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

Respuesta2

watchno es capaz de hacer esto directamente. Aunque puede resaltar las diferencias en la salida del comando (mediante la opción -d) o salir cuando la salida cambia (mediante la opción -g), no es posible mostrar la salida de más de una ejecución. Pero puedes lograrlo a través de otras herramientas comunes.

Una de las muchas soluciones posibles:

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

O más legible:

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

Explicación: La psopción -o nlwpimprime directamente el número de subprocesos, por lo que no es necesario llamar wc -l. También puede utilizar $(pidof programname)en lugar de <PID>para determinar el ID del proceso automáticamente. También agregué la fecha actual vía $(date)la cual me parece útil. Si no te gusta simplemente elimínalo.

información relacionada