subprocess.Popen не удается случайно связаться с нулевым кодом возврата и без ошибок - PullRequest
0 голосов
/ 29 июня 2018

У меня есть подпрограмма, которая часто выполняет команду оболочки и анализирует выходные данные из нее. Для этого я использую subprocess.Popen для выполнения команды оболочки. Протестировано с помощью команд оболочки 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

Может кто-нибудь подсказать мне, как решить такие проблемы? В каком направлении мне нужно сконцентрироваться на поиске первопричины и, возможно, ее решения? Я сильно подозреваю некоторые проблемы с ТРУБОЙ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...