xenapi plugins: Make sure subprocesses finish executing

Fixes bug 1286187

Neither execute_get_output() nor execute() would wait for the process to
fully finish executing. This could potentially create a race condition
where commands execute in a different order than intended.

Also, for execute() it could cause a process to never finish executing if
it generates enough output to block writing to the pipe.

Change-Id: I3404f4b3ca1cddeec2f3e7b393817a6ccc42bec7
This commit is contained in:
Johannes Erdfelt 2014-02-28 15:35:34 +00:00
parent f35c63df24
commit 27c8086028

View File

@ -26,13 +26,13 @@ def execute_get_output(*command):
proc = subprocess.Popen(command, close_fds=True,
stdout=subprocess.PIPE, stderr=devnull)
devnull.close()
return proc.stdout.read().strip()
stdout = proc.communicate()[0]
return stdout.strip()
def execute(*command):
"""Execute without returning stdout."""
devnull = open(os.devnull, 'w')
command = map(str, command)
proc = subprocess.Popen(command, close_fds=True,
stdout=subprocess.PIPE, stderr=devnull)
subprocess.call(command, close_fds=True, stdout=devnull, stderr=devnull)
devnull.close()