Python使用subprocess在本地 或者 其他远端机器上执行命令。
- 防止命令执行时间过长导致一直无法退出的问题。
- 防止命令输出内容过长,实际拿到的数据被截断,不全的问题
备注: 对远端执行命令 需要提前免密,
参考:docker到宿主机免密
import subprocess
import time
def execute_cmd(cmd, remote=None, timeout=5):
"""
@param cmd: 传入要执行的命令
@param remote: 要远程执行的机器节点 host或者ip, 不传入remote认为是本地执行
@param timeout: 命令自动结束的超市时间 默认5s
@return: (退出码,命令正常输出,error信息)
"""
t_beginning = int(time.time())
try:
if remote:
ret = subprocess.Popen("ssh " + remote + " " + cmd, shell=True, close_fds=True,
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
ret = subprocess.Popen(cmd, shell=True, close_fds=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except Exception as e:
return 256, "", e
if ret:
stdout, stderr, task_break = "", "", False
try:
while True:
if ret.poll() is not None:
break
seconds_passed = int(time.time()) - t_beginning
if timeout and seconds_passed > timeout:
ret.terminate()
task_break = True
break
time.sleep(0.1)
tmp_stdout, tmp_stderr = ret.communicate()
stdout += tmp_stdout
stderr += tmp_stderr
if task_break:
stderr = "task is break by timeout,cmd:{},timeout:{}".format(cmd, timeout)
except KeyboardInterrupt:
print "\n进程已手动中断,pid:{}".format(ret.pid)
return 256, "", ""
finally:
ret.stdout.close()
ret.stderr.close()
return ret.returncode, stdout, stderr
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)