subprocess.Popen通信随机失败,返回码为零,没有错误

时间:2018-06-29 15:56:13

标签: python subprocess popen communicate

我有一个例程,该例程经常执行shell命令并解析其输出。为此,我使用subprocess.Popen执行shell命令。已通过shell命令lssystemctl status xxxx.service等进行了测试。

Platform - Linux 3.14.4-yocto-standard x86_64


status_call = subprocess.Popen(shlex.split(<shell_command>),
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)

我使用communicate()来读取上述子进程的输出和错误。我正在考虑错误情况,如果输出的长度为0或错误的长度不为零,并且正在打印错误和返回码。

import subprocess
import shlex

def loop_process():
  count = 0
  iter = 0
  print 'Test Case: Starting the script'
  while True:
    status_call = subprocess.Popen(shlex.split('ls'),
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
    output, error = status_call.communicate()
    if len(error) != 0 or len(output) == 0:
        print 'Test Case : Unable to make the systemctl status call\n'
        print 'error is : ' + str(error) + 'with length of output as ' + str(len(output))
        print 'return_code is ' + str(status_call.returncode)
        count = 0
        iter = 0
    else:
        count = count + 1
        if count > 1000:
           iter = iter + 1
           print iter  
           count = 0
if __name__ == '__main__':
  loop_process()

上述逻辑在随机时间失败,并且没有收到任何错误消息,或者子进程的返回码为零,如下所示

我在这里大约每200,000次看到此问题。我正在嵌入式设备上运行它。在QEMU上运行时,我没有看到此问题

114
115
Unable to make the systemctl status call
error is : with length of output as 0
return_code is 0
1
2

其他情况

387
388
389
Test Case : Unable to make the systemctl status call
error is : with length of output as 0
return_code is 0
1
2

有人可以指导我如何解决此类问题吗?我需要集中精力寻找根本原因和可能的解决方法的方向是什么?我强烈怀疑PIPE有问题。

0 个答案:

没有答案