监视:仅当输出自上次输出以来发生更改时才打印到屏幕

监视:仅当输出自上次输出以来发生更改时才打印到屏幕

我正在运行一个进程,并且正在计算线程数

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)这对我来说似乎很有用。如果您不喜欢它,请将其删除。

相关内容