我正在运行一个进程,并且正在计算线程数
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)
这对我来说似乎很有用。如果您不喜欢它,请将其删除。