我有一个例程,该例程经常执行shell命令并解析其输出。为此,我使用subprocess.Popen
执行shell命令。已通过shell命令ls
,systemctl 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有问题。