我正在尝试创建一个简单的bash脚本来监控以下内容:CPU利用率,出站网络带宽和入站网络带宽。踢球者,我必须使用来自/ proc / loadavg的信息来获取CPU,并使用来自/ proc的信息来获取带宽。
对于CPU利用率,因为它应该在很短的时间间隔内,我可以使用/ proc / loadavg中的第一个值。事实是,我不知道如何获得那个值,所以我到目前为止是这样的:
CPU=sudo cat /proc/loadavg | sed 's///'
echo "CPU Utilization: $CPU %"
我不确定sed操作应该是什么。此外,我不知道如何格式化我将从中获得的内容,以便打印为“16.5%”
对于带宽监视器,我没有丝毫知道我可以在/ proc中使用什么来获取这些信息,所以我对所有建议持开放态度。
答案 0 :(得分:3)
您无需sudo
阅读/proc/loadavg
此外,sed
是错误的工具,请尝试使用cut
,例如:
$ cut -d' ' -f1 < /proc/loadavg
0.04
cut
将按分隔符(用-d
给出)剪切线条,在本例中为空格,然后您可以使用-f
选择字段,在这种情况下是第一个一。
现在,将它转换为百分比实际上是毫无意义的,因为你经常会超过100%(见下面的评论),我看到平均负荷超过50(这将是5000%?)。
在我多年的UNIX / Linux经验中,我不记得曾经看到负载平均值被表示为百分比,如果我遇到这样的事情,我会发现它非常奇数。 / p>
但是如果你真的想要(你没有!),只需用dc
乘以100,就像这样:
$ dc -e "`cut -d' ' -f1 < /proc/loadavg` 100 * p"
29.00
对于CPU利用率,因为它应该在短时间内 interval,我可以使用/ proc / loadavg中的第一个值。
负载平均值不与CPU使用率相同。
如果你想获得CPU利用率,那么这可能是最便携的方式:
$ top -bn2 | grep "Cpu(s)" | \
tail -n1 | \
sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
awk '{print 100 - $1"%"}'
请注意,您需要使用-n2
来获得相当准确的结果。
我已经从this answer改编了这个,其中还列出了一些其他可能性,更简单,但大多数系统默认不会安装大多数提到的工具。
对于带宽监视器,我没有丝毫的线索 可以使用/ proc来获取那种信息,所以我对所有人开放 建议。
例如,您可以在我的系统上使用ifconfig
的输出:
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.178.28 netmask 255.255.255.0 broadcast 192.168.178.255
inet6 2001:980:82cd:1:20c:29ff:fe9e:c84b prefixlen 128 scopeid 0x0<global>
inet6 fe80::20c:29ff:fe9e:c84b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9e:c8:4b txqueuelen 1000 (Ethernet)
RX packets 45891 bytes 36176865 (34.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 20802 bytes 2603821 (2.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这是RX数据包&amp;我们想要的TX包。我们只提取这些值:
$ ifconfig ens33 | grep -E '(R|T)X packets' | grep -Eo '\([0-9].*\)' | tr -d '()'
34.5 MiB
2.5 MiB
grep
以RX或TX grep
为括号\(
,后跟数字[0-9]
,后跟任何字符.*
,后跟一个右括号\
)。使用-o
标记,我们只显示匹配的部分,而不是整行。tr
,我们会移除不需要的括号。这应该是你想要的。如果要获取多个字节,可以在第二个grep中使用不同的grep
模式。我将把它作为练习留给你,究竟是什么。
答案 1 :(得分:1)
以下是如何按cat /proc/loadavg
打印第一个数字输出作为百分比值(但请参阅@ Carpetsmoker关于这是否有意义的警告),舍入到小数点后一位:
printf "1-minute load average: %.1f%%\n" \
$(bc <<<"$(cut -d ' ' -f 1 /proc/loadavg) * 100")