如何自动重启Python程序以解决长期运行中的内存泄漏问题?
绝对可行!对于你这种需要长期运行但存在轻微内存泄漏的场景,自动重启确实是个高效的临时解决方案——毕竟手动排查内存泄漏有时候太耗时,尤其是数学研究类程序可能涉及复杂的计算库或数据结构。下面给你几种适配20核环境的实现思路,你可以根据自己的偏好选择:
方法1:Python守护脚本监控重启
写一个独立的主守护脚本,负责启动你的研究程序,同时实时监控内存占用,达到阈值就自动重启。这种方式逻辑直观,方便调整监控参数。
示例代码如下:
import os import psutil import time from subprocess import Popen # 可配置参数 MAX_MEMORY_GB = 12 # 根据服务器总内存和20核负载调整阈值 RESEARCH_SCRIPT = "your_math_research.py" # 你的研究程序文件名 WAIT_INTERVAL = 60 # 每60秒检查一次内存 RUN_ARGS = ["--cores", "20"] # 给研究程序传递的参数 def monitor_and_restart(): while True: # 启动研究进程 proc = Popen(["python", RESEARCH_SCRIPT] + RUN_ARGS) print(f"✅ 启动研究进程,PID: {proc.pid}") while proc.poll() is None: # 进程未退出时持续监控 time.sleep(WAIT_INTERVAL) try: process = psutil.Process(proc.pid) mem_usage = process.memory_info().rss / (1024 ** 3) # 转换为GB print(f"📊 当前内存占用: {mem_usage:.2f} GB") if mem_usage >= MAX_MEMORY_GB: print(f"⚠️ 内存超出阈值({MAX_MEMORY_GB} GB),正在重启...") proc.kill() break except psutil.NoSuchProcess: print("❌ 进程意外退出,立即重启") break if __name__ == "__main__": monitor_and_restart()
使用说明:
- 先安装依赖库:
pip install psutil - 你可以根据服务器实际内存情况,灵活调整
MAX_MEMORY_GB的值 - 如果研究程序需要更多启动参数,直接在
RUN_ARGS列表里添加即可
方法2:Linux系统级工具(更稳定)
如果你的服务器是Linux环境,用supervisord或systemd实现自动重启会更可靠,甚至系统重启后也能自动恢复运行。
用supervisord的配置示例:
- 安装supervisord:
sudo apt install supervisor(Debian/Ubuntu)或pip install supervisor - 在
/etc/supervisor/conf.d/目录下创建配置文件math_research.conf:
[program:math_research] command=python /绝对路径/your_math_research.py --cores 20 directory=/你的程序所在目录 user=你的用户名 autostart=true autorestart=true # 进程退出就自动重启 startretries=3 # 失败3次后停止尝试 stdout_logfile=/var/log/math_research.log # 标准输出日志 stderr_logfile=/var/log/math_research.err.log # 错误日志
- 重启supervisord服务生效:
sudo systemctl restart supervisor
这种方式的优势:
- 无需自己写监控逻辑,工具原生支持进程守护
- 日志文件可以帮你快速定位程序退出或异常的原因
- 支持自定义重启策略,避免无限循环重启
方法3:程序内部定时退出+外部循环启动
如果不想额外写守护脚本,可以在研究程序内部添加定时退出逻辑,再配合一个简单的shell脚本循环启动。
比如在你的研究程序中加入:
import time import sys # 设置单次运行时长(比如12小时) MAX_RUN_HOURS = 12 start_time = time.time() while time.time() - start_time < MAX_RUN_HOURS * 3600: # 你的核心研究逻辑,比如处理一批计算任务 process_calculation_batch() # 运行时长达标,主动退出 print("⏰ 单次运行时长已满,准备重启...") sys.exit(0)
然后写一个shell脚本run_loop.sh:
#!/bin/bash while true; do python your_math_research.py --cores 20 echo "程序已退出,10秒后重启..." sleep 10 done
给脚本加执行权限:chmod +x run_loop.sh,直接运行即可:./run_loop.sh
关键注意事项
- 数据持久化:一定要在程序退出前(或定期)保存中间计算结果到磁盘/数据库,避免重启丢失进度。可以通过捕获
SIGTERM信号,在进程被终止前执行保存逻辑。 - 资源清理:如果程序占用了文件句柄、网络连接等资源,退出前要显式关闭,避免系统资源耗尽。
- 日志监控:无论用哪种方式,都要开启日志记录,方便后续排查内存泄漏的根源(比如哪部分计算导致内存增长)。
内容的提问来源于stack exchange,提问作者CA13
相关产品推荐
相关产品推荐

