我在包装在python脚本中的unix环境中调用了一些Java二进制文件
当我从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
从shell运行时输出变量的值:
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
似乎在创建新进程后的输出未存储在变量中,我不知道为什么?
答案 0 :(得分:0)
金图尔。
您的问题似乎与此相似:Capture stdout stderr of python subprocess, when it runs from cron or rc.local
看看是否有帮助。
答案 1 :(得分:0)
发生这种情况是因为Java实用程序正在讨论异常,该异常没有被subprocess.Popen缓存
但是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属性中具有任何输出。