我编写了一个小型监视脚本来监视 Linux 服务器上的平均负载(仅用于学习目的,但监视正常运行时间并没有提供我想要的输出)。
它运行良好,但为了获得每个核心的平均负载,我将平均负载值除以核心数。现在这是通过对核心进行硬编码来实现的,如果我选择在另一台服务器上使用它,这会很不方便。
因此,我希望通过类似的变量来完成核心nproc
。
一切都很好,但是由于某种原因,当我使用nproc
核心数时的输出与我对核心进行硬编码时的输出完全不同。
这是我现在的脚本:
#! /bin/bash
PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin:/opt/csw/bin:/usr/local/bin:/bin
while true
do
uptime | awk '{ printf "%2.2f ",$(NF-2)/4 ; printf "%2.2f ",$(NF-1)/4 ; printf "%2.2f\n",$(NF)/4}'
sleep 1
done
如你所见,我将平均负载除以 4(4 核服务器)。这给出了以下输出:
$ ./watch-load.sh
1.05 0.96 1.09
1.05 0.96 1.09
0.96 0.94 1.08
0.96 0.94 1.08
0.96 0.94 1.08
但是当我编辑脚本来使用nproc
它时它看起来像这样:
#! /bin/bash
PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin:/opt/csw/bin:/usr/local/bin:/bin
while true
do
uptime | awk '{ printf "%.2f ",$10/$(nproc) ; printf "%2.2f ",$11/$(nproc) ; printf "%2.2f\n",$12/$(nproc)}'
sleep 1
done
这将给我以下结果:
$ ./watch-load-test.sh
0.22 0.23 0.27
0.22 0.23 0.27
0.22 0.23 0.27
0.28 0.24 0.27
0.28 0.24 0.27
这很奇怪,因为nproc
显示了 4 个核心:
$ nproc
4
我在这里迷茫了。你有什么建议吗?为什么它似乎没有按应有的方式工作?
答案1
在 awk 中,$(nproc)
表示第 字段的值nproc
,其中nproc
是 awk 变量。由于您的 awk 代码没有定义这样的变量,因此它的计算结果为$0
$ echo '1 2 3' | awk '{print $(nproc)}'
1 2 3
如果要将 shell 命令替换的值传递$(nproc)
到 awk 代码中,可以使用-v
命令行语法
前任。
$ echo '1 2 3' | awk -v nproc=$(nproc) '{print nproc}'
2