監視:僅當輸出自上次輸出以來發生變更時才列印到螢幕

監視:僅當輸出自上次輸出以來發生變更時才列印到螢幕

我正在運行一個進程,並且正在計算線程數

ps huH p <PID_OF_U_PROCESS> | wc -l

我可以像這樣運行這個線程watch

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

這將輸出進程正在運行的執行緒數,但通常該數字不會改變。

如果新數字自上次運行命令以來發生了變化,如何僅將新數字列印到螢幕上?

例如:

64 65 64 (幾分鐘過去了) 65

ETC。

答案1

你可以直接透過管道傳輸到uniq

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

答案2

watch無法直接執行此操作。儘管您可以突出顯示命令輸出中的差異(透過 option -d)或在輸出變更時退出(透過 option -g),但無法顯示多次執行的輸出。但您可以透過其他常用工具來實現這一點。

許多可能的解決方案之一:

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

或者更具可讀性:

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

說明:此ps選項-o nlwp直接列印線程數,因此您不必調用wc -l.您也可以使用$(pidof programname)代替 來<PID>自動確定進程 ID。我還添加了當前日期,$(date)這對我來說似乎很有用。如果您不喜歡它,請將其刪除。

相關內容