如何在Shell脚本中获取各Python程序的内存占用情况?
实现思路与命令方案
1. 精准定位目标Python进程
要获取指定脚本的内存数据,首先得准确匹配对应进程,避免误抓其他Python程序:
- 用
pgrep提取进程ID(PID):
若系统默认Python版本是3,直接把命令里的# 获取myp1.py的PID,适配python/python3 PID1=$(pgrep -f "python.*myp1.py") # 获取myo2.py的PID PID2=$(pgrep -f "python.*myo2.py")python换成python3即可。
2. 提取进程内存占用数据
拿到PID后,用ps命令提取两种常用内存指标:
- 内存占比(百分比,方便和总内存比例对比):
MEM1=$(ps -o %mem= -p $PID1) MEM2=$(ps -o %mem= -p $PID2) - 实际物理内存(RSS,单位KB,适合固定阈值判断):
命令里的RSS1=$(ps -o rss= -p $PID1) RSS2=$(ps -o rss= -p $PID2)=是去掉输出表头,方便后续数值计算。
3. 阈值判断与重启逻辑
在Shell脚本里设置内存阈值,超过则自动重启对应程序:
# 示例:设置百分比阈值为20% THRESHOLD=20.0 # 处理myp1.py if (( $(echo "$MEM1 > $THRESHOLD" | bc -l) )); then kill $PID1 sleep 1 # 等待进程完全退出 # 后台重启程序,替换为你的实际路径 nohup python3 /path/to/myp1.py > /dev/null 2>&1 & fi # 处理myo2.py if (( $(echo "$MEM2 > $THRESHOLD" | bc -l) )); then kill $PID2 sleep 1 nohup python3 /path/to/myo2.py > /dev/null 2>&1 & fi
注:用bc -l是因为Shell不支持浮点数比较;nohup确保程序在后台持续运行,不受crontab会话结束影响。
4. crontab定时触发
设置定时任务,比如每10分钟检查一次:
# 打开crontab编辑界面 crontab -e # 添加任务,替换为你的脚本路径 */10 * * * * /bin/bash /path/to/your/check_memory.sh
记得给脚本加可执行权限:chmod +x /path/to/your/check_memory.sh
补充优化
- 若担心同名进程干扰,启动程序时可写入PID文件,后续直接读取:
# 启动myp1.py时写入PID nohup python3 /path/to/myp1.py > /dev/null 2>&1 & echo $! > /var/run/myp1.pid # 读取PID PID1=$(cat /var/run/myp1.pid) - 可添加日志记录,方便排查问题:
echo "$(date): myp1.py内存占用$MEM1%,触发重启" >> /var/log/python_memory_check.log
内容的提问来源于stack exchange,提问作者CSH
相关产品推荐
相关产品推荐

