python内存分配失败_Python subprocess.Popen错误,出现OSError:[Errno 12]在一段时间后无法分配内存...

我有一个Python脚本,它每60秒执行一次,作为后台进程运行。其中一部分是对subprocess.Popen的调用,以获取ps的输出。

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]

运行几天后,该呼叫出现以下错误:

getProcesses中的文件“ /home/admin/sd-agent/checks.py”,行436

__init__中的文件“ /usr/lib/python2.4/subprocess.py”,第533行

_get_handles中的文件“ /usr/lib/python2.4/subprocess.py”,行835

OSError:[Errno 12]无法分配内存

但是,服务器上free的输出为:

$ free -m

已使用的可用共享缓冲区总数

内存:894345549549 0 0 0

-/ +缓冲区/缓存:345549

掉期:0 0 0

我到处寻找问题,发现这篇文章说:

解决方案是向服务器添加更多交换空间。当内核分叉启动建模器或发现过程时,它首先确保在交换存储中有足够的空间来存储新过程(如果需要)。

我注意到上面的免费输出没有可用的交换。这可能是问题所在,并且/或者还有其他解决方案吗?

更新2009年8月13日

作为一系列监视功能的一部分,上述代码每60秒被调用一次。进程被守护,并使用sched安排检查。上述功能的特定代码为:

def getProcesses(self):

self.checksLogger.debug('getProcesses: start')

# Memory logging (case 27152)

if self.agentConfig['debugMode'] and sys.platform == 'linux2':

mem = subprocess.Popen(['free', '-m'], stdout=subprocess.PIPE).communicate()[0]

self.checksLogger.debug('getProcesses: memory before Popen - ' + str(mem))

# Get output from ps

try:

self.checksLogger.debug('getProcesses: attempting Popen')

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]

except Exception, e:

import traceback

self.checksLogger.error('getProcesses: exception = ' + traceback.format_exc())

return False

self.checksLogger.debug('getProcesses: Popen success, parsing')

# Memory logging (case 27152)

if self.agentConfig['debugMode'] and sys.platform == 'linux2':

mem = subprocess.Popen(['free', '-m'], stdout=subprocess.PIPE).communicate()[0]

self.checksLogger.debug('getProcesses: memory after Popen - ' + str(mem))

# Split out each process

processLines = ps.split('\n')

del processLines[0] # Removes the headers

processLines.pop() # Removes a trailing empty line

processes = []

self.checksLogger.debug('getProcesses: Popen success, parsing, looping')

for line in processLines:

line = line.split(None, 10)

processes.append(line)

self.checksLogger.debug('getProcesses: completed, returning')

return processes

这是称为检查的较大类的一部分,该类在守护程序启动时初始化一次。

可以在http://github.com/dmytton/sd-

agent/blob/82f5ff9203e54d2adeee8cfed704d09e3f00e8eb/checks.py中找到整个检查类,该类具有从442行定义的getProcesses函数。doChecks()从520行开始调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值