按用户或名称监控Linux进程

时间:2016-03-31 17:07:41

标签: linux bash awk grep cpanel

我需要使用Cpanel从我的Centos 6.7获取统计数据并发送到我的外部监视器服务器。我想得到的是在过去3分钟内每个用户或每个进程名称的平均cpu负载。经过多次研究和测试后,没有找到任何可行的解决方案,除了bash运行顶部

top -d 180 -b -n 2 > /top.log

第二次迭代看起来像......

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
38017 mysql     20   0  760m 265m 6324 S  1.4 14.2 244:27.08 mysqld
39501 nobody    20   0 1047m  93m 7068 S  0.1  5.0   0:06.80 httpd
54877 johnd     20   0 32728 3612 2364 S  0.0  0.2   0:00.09 imap
51530 johnd     20   0  353m 5372 1928 S  0.0  0.3   0:04.17 php-fpm
39500 nobody    20   0 1046m  79m 3656 S  0.0  4.3   0:02.57 httpd
    7 root      20   0     0    0    0 S  0.0  0.0  27:47.61 events/0
39497 nobody    20   0 1046m  84m 7784 S  0.0  4.5   0:02.77 httpd
etc...

然后grep(仅在第二次迭代输出中)使用COMMAND或USER,求和除以100得到像cpu-load这样的值

echo "$PRTGTOP" | grep johnd | awk '{ sum += $9; } END { print sum/100; }'

我应该也可以尝试计算进程时间等?,也许有一种更简单的方法来实现相同的结果,也许用第三方软件生成统计数据?

感谢。

3 个答案:

答案 0 :(得分:0)

top/proc/*/stat获取其信息。 /proc下的每个数字目录都是当前正在运行的进程的进程号。

您可能更容易直接从这些目录收集数据。数据格式定义明确,可以在man proc下的名为" / proc / [pid] / stat"的小节中找到。

答案 1 :(得分:0)

您可以尝试pidstat工具(sysstat包的一部分):

pidstat -C httpd -U johnd -h -u 180 1 | awk '{ sum += $7; } END { print sum/100;}'

这将返回与httpd命令字符串和johnd用户匹配的所有进程的CPU使用百分比超过180 - 秒间隔。

答案 2 :(得分:-1)

好吧,pidstat更好,谢谢!,但是如果USER pid只运行几秒钟就没有报告cpu使用。我找到了最好的结果:

#run pidstat with 10 iterations for 18 times
pidstat -U -u 10 18 > /pidstat.log

然后

#sum all cpu usage and divide by 18   

cat /pidstat.log | grep -v Average | grep johnd | awk '{ sum += $8; } END { print sum/100/18;}' OFMT="%3.3f"
cat /pidstat.log | grep -v Average | grep httpd | awk '{ sum += $8; } END { print sum/100/18;}' OFMT="%3.3f"

有了这个,我获得了每个用户最佳的CPU使用率,即使进程只运行了几秒但CPU使用率很高