制作一个简单的系统监视器bash脚本

时间:2014-02-18 23:09:10

标签: bash

我正在尝试创建一个简单的bash脚本来监控以下内容:CPU利用率,出站网络带宽和入站网络带宽。踢球者,我必须使用来自/ proc / loadavg的信息来获取CPU,并使用来自/ proc的信息来获取带宽。

对于CPU利用率,因为它应该在很短的时间间隔内,我可以使用/ proc / loadavg中的第一个值。事实是,我不知道如何获得那个值,所以我到目前为止是这样的:

CPU=sudo cat /proc/loadavg | sed 's///'
echo "CPU Utilization: $CPU %"

我不确定sed操作应该是什么。此外,我不知道如何格式化我将从中获得的内容,以便打印为“16.5%”

对于带宽监视器,我没有丝毫知道我可以在/ proc中使用什么来获取这些信息,所以我对所有建议持开放态度。

2 个答案:

答案 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使用率相同。

  • 平均负载为1意味着有一个进程在等待某事(通常是CPU或磁盘)。
  • 平均负载为2表示有两个进程在等待。
  • 平均负载为0.5(超过最后一分钟),可以表示30秒内有一个进程在等待,30秒没有进程在等待。它意味着15秒内有两个进程在等待,45秒没有进程在等待。此处的关键字为平均值

如果你想获得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")