poky/scripts/qemuimage-testlib-pythonhelper
Richard Purdie ebf1f6dacf 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.

(From OE-Core rev: a62263761fc77c139d418236cc52b04bed629229)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2013-03-27 17:28:00 +00:00

62 lines
1.6 KiB
Python
Executable File

#!/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 <pid>",
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()