间歇“OSError:[Errno 7]参数列表太长”,命令短(~125个字符)

时间:2014-07-16 18:40:54

标签: python linux python-2.7 subprocess

在Linux上运行在apache2 + mod_wsgi下的代码有时会产生以下输出。

   notes.py
            cmd_list = [
                    'abc_generate_pdf',
                    '--cdb-url-prefix', model.config('cdb_url_prefix'),
                    '--request-cid', request_cid,
            ]
            log.info("About to run: {!r}".format(cmd_list))
            subprocess.Popen(cmd_list)
...
2014-07-16 11:03:44,779 INFO     pid:17925,140353357215488 abc.webapp.check.notes:198:approval_revoke About to run: ['abc_generate_pdf', '--cdb-url-prefix', 'xxxxdev', '--request-cid', u'xxxxx_xxx_2014-07-15_16.12.50.108807_685932a62c7c6226987acdeda367dbc3']
2014-07-16 11:03:45,250 ERROR    pid:17925,140353357215488 abc.webapp.check.notes:208:approval_revoke Unknown error; approval not updated.
Traceback (most recent call last):
  File "/home/abc/abc/webapp/check/notes.py", line 199, in approval_revoke
    subprocess.Popen(cmd_list)
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 7] Argument list too long

输出已略有匿名,但字符数仍然准确。

问题似乎发生在Web服务器运行了很长时间后,并且在重新启动时消失了,但是很难准确确定触发器的内容。

为什么我会收到错误,我该怎么做才能阻止错误?

此问题与Python OSError no 7 (Argument list too long ) in linux非常相似,但没有令人满意的答案。

编辑:我应该注意到问题也发生在pure-python werkzeug服务器上。

2 个答案:

答案 0 :(得分:9)

我们遇到了类似的问题并且在很长一段时间内困扰着我们。今天,我们找到了根本原因。

错误消息有点误导,它不是命令行的“参数”太长,它实际上是与命令一起传递的OS环境。在这种情况下,Python os.environ。在我们的代码库中,有一个行代码:

os.environ['PATH'] = ':'.join([os.environ['PATH'], self.clitoolsdir])

它是班级__init__()的一部分。无论何时创建新对象,os.environ都会变长,最终变得“太长”。

答案 1 :(得分:0)

这听起来像是内存泄漏。考虑:

  1. Popen调用是否正确关闭,输出消耗了?

    我是这种风格的粉丝:

    subprocess.check_call('mycommand')
    
  2. 根据Python OSError no 7 (Argument list too long ) in linux的建议,strace该计划会发生什么?这个问题和相关问题听起来非常相似。