从终端以单行形式返回带宽、CPU 和内存统计信息

从终端以单行形式返回带宽、CPU 和内存统计信息

我正在尝试创建一个简单的监控系统,该系统将显示一个销售图表,该图表完全链接到与销售相关的带宽、CPU 和内存统计数据。因此,如果我每 5 秒销售 1 个小部件,这将取决于我的带宽等是否高于某个阈值。所以我制定了一种制作图表的方法,但我只是花时间获取统计数据。我可以使用多种监控系统中的任何一个,但我只需要 1 条线路每秒一次的带宽、CPU 使用率和内存使用率。我制作了一个 python 脚本,可以从所有接口获取所有 IP 信息。但是,如果我有一个脚本,我可以从终端运行,只输出一行,我可以将其传输到一个文件,然后访问该文件来运行我的实时图表。

所以对于网络我可以使用:

$ ifconfig

我将其传输到 json 文件中以方便参考。

我可以用:

$ free -m

对于内存,我想我也可以将其传输到文件中

然后我可以使用:

$ cat /proc/loadavg

对于 CPU 并再次通过管道传输。

有没有更简单的方法来做到这一点?这样我就可以收到每个命令的一行,并且可以轻松(更重要的是快速)通过 Javascript 或 HTML5 FileReader 将该信息发送到图形解决方案?

答案1

我认为没有一种简单的方法来聚合您想要的数据,但您可以将一堆命令粘在一起,然后将其输出到任何地方。我花了一点时间想出了一个例子。

{
  printf '%s' '{"load":["'$(cut -d' ' --output-delimiter='","' -f-3 /proc/loadavg)
  printf '%s' '"],"net":{'
  tail -n+3 /proc/net/dev|awk -F' ' '{
    gsub(/:/,"");
    printf "\"%s\":{\"rxbytes\":\"%s\",\"rxpackets\":\"%s\",\"rxerrs\":\"%s\",\"rxdrop\":\"%s\",\"txbytes\":\"%s\",\"txpackets\":\"%s\",\"txerrs\":\"%s\",\"txdrop\":\"%s\"},",$1,$2,$3,$4,$5,$10,$11,$12,$13
  }'|sed 's/,$//'
  printf '%s' '},"mem":{'
  grep -E '^(MemTotal|MemFree|SwapTotal|SwapFree):' /proc/meminfo|tr 'A-Z' 'a-z'|awk -F' ' '{gsub(/:/,""); printf "\"%s\":\"%s\",",$1,$2}'|sed 's/,$//'
  printf '%s' '}}'
}

你可以把它压缩成这样:

{ printf '%s' '{"load":["'$(cut -d' ' --output-delimiter='","' -f-3 /proc/loadavg); printf '%s' '"],"net":{'; tail -n+3 /proc/net/dev|awk -F' ' '{ gsub(/:/,""); printf "\"%s\":{\"rxbytes\":\"%s\",\"rxpackets\":\"%s\",\"rxerrs\":\"%s\",\"rxdrop\":\"%s\",\"txbytes\":\"%s\",\"txpackets\":\"%s\",\"txerrs\":\"%s\",\"txdrop\":\"%s\"},",$1,$2,$3,$4,$5,$10,$11,$12,$13 }'|sed 's/,$//'; printf '%s' '},"mem":{'; grep -E '^(MemTotal|MemFree|SwapTotal|SwapFree):' /proc/meminfo|tr 'A-Z' 'a-z'|awk -F' ' '{gsub(/:/,""); printf "\"%s\":\"%s\",",$1,$2}'|sed 's/,$//'; printf '%s' '}}'; }

这应该输出一些(有效的)JSON,如下所示:

{"load":["0.00","0.01","0.05"],"net":{"lo":{"rxbytes":"2524231953","rxpackets":"1381864","rxerrs":"0","rxdrop":"0","txbytes":"2524231953","txpackets":"1381864","txerrs":"0","txdrop":"0"},"eth0":{"rxbytes":"2093914043","rxpackets":"2859952","rxerrs":"0","rxdrop":"0","txbytes":"1774385937","txpackets":"1485252","txerrs":"0","txdrop":"0"}},"mem":{"memtotal":"1692584","memfree":"20248","swaptotal":"917500","swapfree":"916288"}}

然后,您可以| whatever在闭合卷曲之后添加以将其通过管道传输到任何内容。

答案2

您可能想了解一下i3状态。它并不是真正为此目的而设计的,但听起来它可以很好地满足您的要求。

相关内容