收集占用内存的进程(包括子进程)

收集占用内存的进程(包括子进程)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash

file=/home/work/processors.log


total_Mem=$(free -m|awk '{print $2}'|sed -n '2p')
used_Mem=$(free -m | awk '{print $3}' | sed -n '2p')

#内存使用率
usedPerMemory=$(awk 'BEGIN{printf "%.0f",('$used_Mem'/'$total_Mem')*100}')

#如果内存使用率大于等于90
if [ $usedPerMemory -ge 90 ];then

# 收集占用内存最高的top20个进程,包括子进程
processor=$(ps aux | sort -k4nr | head -20 | awk '{print $NF}' | uniq -c)

echo "#######$(date +%F\ %T)########" > $file

echo "当前内存使用率: $usedPerMemory%" >> $file

echo "当前使用内存top20进程: " >> $file

echo "$processor" >> $file

# 计算进程(包括子进程)实际占用的物理内存量


#对每个进程,计算其(包括其子进程)占用的物理内存

for PerProcessor in $(ps aux | sort -k4nr | head -20 | awk '{print $NF}' | uniq);do

# 获取每个进程的PID

ProPid=$(ps aux | grep $PerProcessor | grep -v grep| awk '{print $2}')

#计算该进程(包括子进程)消耗的物理内存总量

total_mem_each_pro=$(for pid in $ProPid; do cat /proc/$pid/smaps; done | awk '/Pss/ {mem += $2} END {print mem, "kB"}')

#下面这条语句也可以计算出进程(包括子进程)占用的物理内存总量
# ps aux | grep $PerProcessor | grep -v grep | awk '{sum += $6} END{print sum}'

echo " $PerProcessor takes $total_mem_each_pro memory " >> $file

done

#将文件内容发送到邮箱
mail -s "hsq-cron占用内存过高" huangyong@doweidu.com < $file

fi
fi

本文标题:收集占用内存的进程(包括子进程)

文章作者:Jesse

发布时间:2018年06月12日 - 22:06

最后更新:2020年06月30日 - 20:06

原始链接:https://jesse.top/2018/06/12/Linux-Basic/shell&shell脚本/收集占用内存最多的进程/

许可协议: 禁止商业用途 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!