From 61760eabc5b48d82e4da10903f8c5433dc2db79f Mon Sep 17 00:00:00 2001
From: Bob Lantz <rlantz@cs.stanford.edu>
Date: Wed, 24 Sep 2014 11:57:46 -0700
Subject: [PATCH] Make sure we 'sudo kill' our sudo pexpect process in close().

This should more reliably shut down pexpect subprocesses when
build.py exits before completion.
---
 util/vm/build.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/util/vm/build.py b/util/vm/build.py
index eb0206cc..eca4096c 100755
--- a/util/vm/build.py
+++ b/util/vm/build.py
@@ -441,7 +441,12 @@ def boot( cow, kernel, initrd, logfile, memory=1024 ):
        returns: pexpect object to qemu process"""
     # pexpect might not be installed until after depend() is called
     global pexpect
-    import pexpect
+    if not pexpect:
+        import pexpect
+    class Spawn( pexpect.spawn ):
+        "Subprocess is sudo, so we have to sudo kill it"
+        def close( self, force=False ):
+            srun( 'kill %d' % self.pid )
     arch = archFor( kernel )
     log( '* Detected kernel architecture', arch )
     if NoKVM:
@@ -462,7 +467,7 @@ def boot( cow, kernel, initrd, logfile, memory=1024 ):
     cmd = ' '.join( cmd )
     log( '* BOOTING VM FROM', cow )
     log( cmd )
-    vm = pexpect.spawn( cmd, timeout=TIMEOUT, logfile=logfile )
+    vm = Spawn( cmd, timeout=TIMEOUT, logfile=logfile )
     return vm
 
 
-- 
GitLab