Beobachten: Nur auf dem Bildschirm drucken, wenn sich die Ausgabe seit der letzten Ausgabe geändert hat

Beobachten: Nur auf dem Bildschirm drucken, wenn sich die Ausgabe seit der letzten Ausgabe geändert hat

Ich führe einen Prozess aus und zähle die Anzahl der Threads mit

ps huH p <PID_OF_U_PROCESS> | wc -l

watchIch kann diesen Thread so ausführen :

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

Dadurch wird die Anzahl der Threads ausgegeben, die der Prozess ausführt. Normalerweise ändert sich diese Zahl jedoch nicht.

Wie kann ich die neue Nummer nur dann auf dem Bildschirm ausgeben, wenn sie sich seit der letzten Ausführung des Befehls geändert hat?

Zum Beispiel:

64 65 64 (ein paar Minuten vergehen) 65

Usw.

Antwort1

Sie können einfach weiterleiten an uniq:

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

Antwort2

watchist dazu nicht in der Lage. Obwohl Sie Unterschiede in der Befehlsausgabe hervorheben (über die Option -d) oder beenden können, wenn sich die Ausgabe ändert (über die Option -g), ist es nicht möglich, die Ausgabe mehrerer Durchläufe anzuzeigen. Dies können Sie jedoch über andere gängige Tools erreichen.

Eine von vielen möglichen Lösungen:

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

Oder besser lesbar:

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

Erklärung: Die psOption -o nlwpgibt direkt die Anzahl der Threads aus, sodass Sie nicht aufrufen müssen wc -l. Sie können auch $(pidof programname)anstelle von verwenden <PID>, um die Prozess-ID automatisch zu ermitteln. Ich habe auch das aktuelle Datum über hinzugefügt, $(date)was mir nützlich erscheint. Wenn es Ihnen nicht gefällt, entfernen Sie es einfach.

verwandte Informationen