在linux中,有关apache内存使用的数据都可以在/proc/$apachepid/smaps中获得,在用脚本进行统计时,可以针对这里面的字段进行统计分类。
1,获取apache的pid,如下图:
下面用awk来获取pid=652的内存占用数据,例如:
输出如下图:
分析一个apache进程的数据,可以用一行命令来操作。
对所有进程的分析,可以将进程pid放进数组中,然后用awk加以分析即可。
例如:
#!/bin/bash
#filename:count_apache_mem.sh
APACHEPID=($(ps -eo user,pid | awk '$1~"^apache"{print $2}'))
#设定数组变量APACHEPID并把获得apache-pid复制给这个数组
echo "apache total process: ${#APACHEPID[@]}"
#数组元素的个数,即apache进程的总数
for pid in ${APACHEPID[@]}
do
echo $pid:
awk ' $3 ~ "kB" { sum[$1] += $2} END {for (key in sum) print key, sum[key]" kB"}' /proc/$pid/smaps
done >> /tmp/apachemem
#在数组中循环执行awk统计,然后将统计结果写入到/tmp/apachemem临时文件。
调用示例,如下图:
以下是对以上脚本的改进,将数据汇总后,用awk进行分析,然后删除掉汇总文件。
代码如下:
#!/bin/bash
APACHEPID=($(ps -eo user,pid | awk '$1~"^apache"{print $2}'))
echo "apache total process: ${#APACHEPID[@]}"
for pid in ${APACHEPID[@]}
do
echo $pid:
awk ' $3 ~ "kB" { sum[$1] += $2} END {for (key in sum) print key, sum[key]" kB"}' /proc/$pid/smaps
done >> /tmp/apachemem
echo "apache total memsum:"
awk '$3 ~ "kB" { sum[$1] += $2} END {for (key in sum) print key, sum[key]" kB"}' /tmp/apachemem
echo "delete tmp file!"
rm -fr /tmp/apachemem
下面继续改造该脚本,用到了shell自定义函数,如下:
#!/bin/bash
TMPFILE=/tmp/apachemem
#get apache pid
APACHEPID=($(ps -eo user,pid | awk '$1~"^apache"{print $2}'))
echo "apache total process: ${#APACHEPID[@]}"
#define memtotal
memtotal() {
filename=$1
awk ' $3 ~ "kB" { sum[$1] += $2} END {for (key in sum) print key, sum[key]" kB"}' $filename
}
#get every pid memtotal into tmpfile
for pid in ${APACHEPID[@]}
do
echo $pid:
memtotal /proc/$pid/smaps
done >> $TMPFILE
#get apache total memsum
echo "apache total memsum:"
memtotal $TMPFILE
#delete tmpfile
echo "delete tmp file!"
#rm -fr /tmp/apachemem
代码说明:
把统计的过程设置为一个函数memtotal。
调用示例:
有关用shell脚本统计apache内存占用例子,就分享这些吧,大家可以在此脚本上自行扩展相关功能,比如生成简洁易懂的报表,加入定时任务cron等。