subprocess.Popen: не повторяет полный вывод при запуске через crontab - PullRequest
0 голосов
/ 01 апреля 2019

Я вызываю некоторый двоичный файл Java в среде Unix, завернутый в скрипт Python

Когда я вызываю скрипт из bash, вывод получается чистым и также сохраняется в нужной переменной, однако, когда я запускаю тот же скрипт из Cron,Сохраненный вывод (в переменной)

мой код:

command = '/opt/HP/BSM/PMDB/bin/abcAdminUtil -abort -streamId ETL_' \
          'SystemManagement_PA@Fact_SCOPE_OVPAGlobal'
proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, 
                       stderr=subprocess.PIPE)
(output, err) = proc.communicate() # Storing Output in output variable

Значение выходной переменной при запуске из оболочки:

Abort cmd output:PID:8717
Executing abort function
hibernateConfigurationFile = /OBRHA/HPE-OBR/PMDB/lib/hibernate-core-4.3.8.Final.jar
Starting to Abort Stream ETL_SystemManagement_PA@Fact_SCOPE_OVPAGlobal
Aborting StreamETL_SystemManagement_PA@Fact_SCOPE_OVPAGlobal

Значение выходной переменной приработает из cron:

PID:830

Кажется, что вывод после создания нового процесса не сохраняется внутри переменной, я не знаю почему?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Это произошло из-за того, что утилита Java выдавала исключение, которое не кэшируется подпроцессом. Открыто

Однако исключение перехватывается subprocess.check_output

Обновленный код:

try:
    output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
except subprocess.CalledProcessError as exc:
    print("Status : FAIL", exc.returncode, exc.output)
else:
    print("Output of Resume cmd: \n{}\n".format(output))
    file.write("Output of Resume cmd: \n{}\n".format(output) + "\n") 

Вывод кода:

('Status : FAIL', -11, 'PID:37319\n')
('Status : FAIL', -11, 'PID:37320\n')

Следовательно, команда выдает исключение, кэшируется subprocess.check_output, но не subprocess.Popen

Извлечение из официальной страницы subprocess.check_output

Если код возврата был ненулевым, возникает CalledProcessError.У объекта CalledProcessError будет код возврата в атрибуте returncode и любые выходные данные в атрибуте output.

0 голосов
/ 01 апреля 2019

Kintul.

Ваш вопрос очень похож на этот: Захват stdout stderr подпроцесса python, когда он запускается из cron или rc.local

Посмотрите, поможет ли это вам.

...