From b9e052ed6b604f0049bcfa968a57f15d6e3d6395 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Tue, 19 Mar 2013 11:44:27 +0000 Subject: qemu-testlib: Add python helper and simplify shell The current code has a race since it greps for *any* qemu process running, even if it isn't the one we started. This leads to some sanity tests potentially failing on machines where multiple sets of sanity tests are running. To resovle this and some other ugly code issues, add a python script to accurately walk the process tree and find the qemu process. We can then replace all the shell functions attempting this which happen to work in many cases but not all. Also clean up some of the error handling so its more legible. Signed-off-by: Richard Purdie --- scripts/qemuimage-testlib-pythonhelper | 61 ++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 scripts/qemuimage-testlib-pythonhelper (limited to 'scripts/qemuimage-testlib-pythonhelper') diff --git a/scripts/qemuimage-testlib-pythonhelper b/scripts/qemuimage-testlib-pythonhelper new file mode 100755 index 0000000000..2ca61ca06a --- /dev/null +++ b/scripts/qemuimage-testlib-pythonhelper @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +import optparse +import subprocess +import sys + +parser = optparse.OptionParser( + usage = """ + %prog [options] +""") + +parser.add_option("-q", "--findqemu", + help = "find a qemu beneath the process ", + action="store", dest="findqemu") + +options, args = parser.parse_args(sys.argv) + +if options.findqemu: + # + # Walk the process tree from the process specified looking for a qemu-system. Return its pid. + # + ps = subprocess.Popen(['ps', 'ax', '-o', 'pid,ppid,command'], stdout=subprocess.PIPE).communicate()[0] + processes = ps.split('\n') + nfields = len(processes[0].split()) - 1 + pids = {} + commands = {} + for row in processes[1:]: + data = row.split(None, nfields) + if len(data) != 3: + continue + if data[1] not in pids: + pids[data[1]] = [] + pids[data[1]].append(data[0]) + commands[data[0]] = data[2] + + if options.findqemu not in pids: + print "No children found matching %s" % options.findqemu + sys.exit(1) + + parents = [] + newparents = pids[options.findqemu] + while newparents: + next = [] + for p in newparents: + if p in pids: + for n in pids[p]: + if n not in parents and n not in next: + next.append(n) + + if p not in parents: + parents.append(p) + newparents = next + #print "Children matching %s:" % str(parents) + for p in parents: + if "qemu-system" in commands[p]: + print p + sys.exit(0) + sys.exit(1) +else: + parser.print_help() + -- cgit v1.2.3