Python 调用shell脚本时,使用subprocess.Popen()的方式,而后使用遍历的方式读取日志输出时,会有一个隐藏的问题,即如果shell脚本中有后台执行的命令(即command &),就会让获取日志的子进程一直卡住,应该注意这种情况,在shell脚本中严谨的杀死此类进程
executeScriptProcess = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True,
universal_newlines=True,
)
# 获取执行输出,如果cmd中或者cmd启动的一个脚本中存在类似command & 的后台持续运行的命令,那么会永远卡在这一句
# 即对executeScriptProcess.stdout的遍历不完成,且不会进行下一次遍历
for line in executeScriptProcess.stdout:
executeScriptProcess.stdout.flush() # 刷新缓存,防止缓存过多造成卡死
print("ShellOut-> %s", line.rstrip("\n"))
# 等待执行结束
executeScriptProcess.wait()
print(
"ShellReturncode-> %s", str(executeScriptProcess.returncode)
)