从ps虚假输出解析数据(不知道如何唤醒它!)

时间:2015-05-07 19:14:09

标签: bash parsing awk scripting grep

所以我一直在根据ps faux的输出进行逆向工程。我已经让它主要用于工作,但是我遇到了它如何计算PHP进程的问题。例如,这是我试图复制的脚本的输出:

Top SQL Apache statistics: CPU %: 0 | Mem %: 1.8 Total PHP statistics: CPU %: 0 | Mem %: 83.9 Top PHP Users 391 user -> CPU %: 0 | Mem %: 83.9 Top PHP Scripts 307 /home/user/public_html/gg/ajax_calls2.php -> CPU %: 0 | Mem %: 70.7 36 /home/user/public_html/gg/support/crm/index.php -> CPU %: 0 | Mem %: 5 8 /home/user/public_html/gg/support/advanced_search.php -> CPU %: 0 | Mem %: 1.5

我最麻烦的是为每个用户抓取正在运行的php脚本,然后计算每个进程并计算每个进程的CPU / MEM使用情况。到目前为止我写的AWK语句只为每个用户输出一个脚本,而不是为每个用户输出所有脚本。

这是我到目前为止所做的:

变量声明:

function join2 { local IFS="$1"; shift; echo "$*"; };ix="0"; ixx="5"; count="0"; count2=$(ps faux | egrep -w 'usr/bin/php|/opt/php*/bin/'|awk '{print $1, $3, $4,$14, $15}' | wc -l);

首先,我将ps faux中的所有PHP进程存储在一个数组中:

initialARRAY=($(ps faux | egrep -w 'usr/bin/php|/opt/php*/bin/'|awk '{print $1, $3, $4,$14, $15}'));

然后我编写了一个循环来将数组的元素连接成一行(因为数组将每个字段分隔在不同的行上),因此每个数组元素都是来自ps faux的整个PHP脚本行:

while [[ $count -lt $count2 ]]; do memARRAY+=("$(join2 ' ' ${initialARRAY[@]:$ix:$ixx})"); count=$(( $count + 1 )); ix=$(( $ix + 5 )); done

数组memARRAY的内容如下:

root@server [~]# printf "%s\n" "${memARRAY[@]}"
user 0.0 1.0 /usr/bin/php /home/user/public_html/cart.php
user 0.0 0.9 /usr/bin/php /home/user/public_html/cart.php
user3 0.0 0.2 /usr/bin/php /home/user3/public_html/manager.php
user3 0.0 0.4 /usr/bin/php /home/user3/public_html/manager.php
user3 0.0 0.3 /usr/bin/php /home/user3/public_html/manager.php
user3 0.0 0.2 /usr/bin/php /home/user3/public_html/search.php
user3 0.0 0.1 /usr/bin/php /home/user3/public_html/search.php`

没有间距,因为我不知道如何复制和粘贴到堆栈中而没有奇怪的间距问题。

现在我遇到的问题是,当我尝试计算每个用户的进程数,同时还计算和总结每个脚本的CPU / MEM使用情况时,最终输出只显示一个脚本,而不是2个脚本正在为user3运行。

这是我认为不能正常工作的部分:

    for i in $(printf '%s\n' "${memARRAY[@]}" | awk '{print $1}' | sort | uniq ); do echo -e "Resource Usage by Script:\n $(printf '%s\n' "${memARRAY[@]}" | grep ${i} | awk '{ x+=$2; y+=$3; z=$4; w=$5; count++$5 }END{print "     Procs:",count,"",z,w,"","CPU: ",x,"%"," ","MEM:", y,"%"}')\n";done"`

上述行的输出是这样的:

    [[ User Information for: user3 ]]
    Resource Usage by Script:
          Procs: 2  [ /usr/bin/php /home/user3/public_html/search.php ]  CPU:  0 %    MEM:  0.4 %
    [[ User Information for: user ]]
    Resource Usage by Script:
          Procs: 10  [ /usr/bin/php /home/user/public_html/cart.php ]  CPU:  0 %    MEM:  9.9 %`

正如您所看到的,它只计算并计算了为user3用户运行的两个脚本中的一个。我对如何计算并输出每个用户的所有脚本感到茫然。

非常感谢任何帮助!

0 个答案:

没有答案