From c11d577349b2b3c11d7e75bcd4767189b2bc796d Mon Sep 17 00:00:00 2001 From: cody burkard <cody@onlab.us> Date: Wed, 27 Aug 2014 08:44:08 -0700 Subject: [PATCH] parse pid printed when backgrounding a process --- mininet/net.py | 2 +- mininet/node.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/mininet/net.py b/mininet/net.py index a4477d37..8a6acdcc 100755 --- a/mininet/net.py +++ b/mininet/net.py @@ -740,7 +740,7 @@ def runCpuLimitTest( self, cpu, duration=5 ): sleep( 1 ) outputs.append( quietRun( cmd ).strip() ) for h in hosts: - h.cmd( 'kill %1' ) + h.cmd( 'kill $!' ) cpu_fractions = [] for test_output in outputs: # Split by line. Ignore first line, which looks like this: diff --git a/mininet/node.py b/mininet/node.py index 19f26d7f..4461a401 100644 --- a/mininet/node.py +++ b/mininet/node.py @@ -160,6 +160,7 @@ def startShell( self ): self.pollOut.poll() self.waiting = False self.cmd( 'stty -echo' ) + self.cmd( 'set +m' ) def cleanup( self ): "Help python collect its garbage." @@ -241,9 +242,13 @@ def sendCmd( self, *args, **kwargs ): if printPid and not isShellBuiltin( cmd ): if len( cmd ) > 0 and cmd[ -1 ] == '&': # print ^A{pid}\n so monitor() can set lastPid - cmd += ' printf "\\001%d\n" $! \n' + cmd += ' printf "\\001%d\\012" $! ' else: cmd = 'mnexec -p ' + cmd + # if a builtin command is backgrounded, it yields a PID + elif isShellBuiltin( cmd ): + if len( cmd ) > 0 and cmd[ -1 ] == '&': + cmd += ' printf "\\001%d\\012" $! ' self.write( cmd + '\n' ) self.lastPid = None self.waiting = True @@ -258,9 +263,13 @@ def monitor( self, timeoutms=None, findPid=True ): timeoutms: timeout in ms or None to wait indefinitely.""" self.waitReadable( timeoutms ) data = self.read( 1024 ) + pidre = r'\[\d+\] \d+\r\n' # Look for PID marker = chr( 1 ) + r'\d+\r\n' if findPid and chr( 1 ) in data: + # suppress the job and PID of a backgrounded command + if re.findall( pidre, data ): + data = re.sub( pidre, '', data ) # Marker can be read in chunks; continue until all of it is read while not re.findall( marker, data ): data += self.read( 1024 ) @@ -1262,7 +1271,7 @@ def start( self ): if self.cdir is not None: self.cmd( 'cd ' + self.cdir ) self.cmd( self.command + ' ' + self.cargs % self.port + - ' 1>' + cout + ' 2>' + cout + '&' ) + ' 1>' + cout + ' 2>' + cout + ' &' ) self.execed = False def stop( self ): -- GitLab