You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中获取各Python程序的内存占用情况?

实现思路与命令方案

1. 精准定位目标Python进程

要获取指定脚本的内存数据,首先得准确匹配对应进程,避免误抓其他Python程序:

  • 用pgrep提取进程ID(PID):
    # 获取myp1.py的PID,适配python/python3
    PID1=$(pgrep -f "python.*myp1.py")
    # 获取myo2.py的PID
    PID2=$(pgrep -f "python.*myo2.py")
    
    若系统默认Python版本是3,直接把命令里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:42:11