У меня есть подпрограмма, которая часто выполняет команду оболочки и анализирует выходные данные из нее. Для этого я использую 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
Может кто-нибудь подсказать мне, как решить такие проблемы? В каком направлении мне нужно сконцентрироваться на поиске первопричины и, возможно, ее решения? Я сильно подозреваю некоторые проблемы с ТРУБОЙ.