summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChen Qi <Qi.Chen@windriver.com>2018-09-25 15:08:25 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-09-25 23:15:42 +0100
commite8acef383767cfd1ef0c3d3c45d9d6eb1c83b3e7 (patch)
treed8011471c8c733dafc6ce698388e2dabfcc7f47f
parentab7b7e222b88e40f2a5011fc16bbd784e6be55e5 (diff)
downloadopenembedded-core-contrib-e8acef383767cfd1ef0c3d3c45d9d6eb1c83b3e7.tar.gz
openembedded-core-contrib-e8acef383767cfd1ef0c3d3c45d9d6eb1c83b3e7.tar.bz2
openembedded-core-contrib-e8acef383767cfd1ef0c3d3c45d9d6eb1c83b3e7.zip
runqemu: fix handling of SIGTERM and the problem of line wrapping
The current handling of SIGTERM is incorrect as the process pid returned by Popen call with shell setting to True is actualy the shell instead of the qemu process. So use shlex to split cmd so that we can avoid using shell=True. This ensures the child process is the actual qemu process. Also, as we install a SIGTERM handler, we need handle the situation of qemu terminated by SIGTERM, otherwise we will get ERROR message in such case. Besides, we have a problem that after running qemu, the terminal's behavior is incorrect regarding long lines or long commands. Long commands or long outputs should appear in multiple lines, but they appear in the same line, overriding previous output. Use `tput smam' to fix this problem. Signed-off-by: Chen Qi <Qi.Chen@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rwxr-xr-xscripts/runqemu14
1 files changed, 11 insertions, 3 deletions
diff --git a/scripts/runqemu b/scripts/runqemu
index 409d17c648..087220ca0a 100755
--- a/scripts/runqemu
+++ b/scripts/runqemu
@@ -1202,6 +1202,7 @@ class BaseConfig(object):
self.qemu_opt += " -serial mon:vc -serial null"
def start_qemu(self):
+ import shlex
if self.kernel:
kernel_opts = "-kernel %s -append '%s %s %s %s'" % (self.kernel, self.kernel_cmdline,
self.kernel_cmdline_script, self.get('QB_KERNEL_CMDLINE_APPEND'),
@@ -1211,11 +1212,16 @@ class BaseConfig(object):
else:
kernel_opts = ""
cmd = "%s %s" % (self.qemu_opt, kernel_opts)
+ cmds = shlex.split(cmd)
logger.info('Running %s\n' % cmd)
- process = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+ process = subprocess.Popen(cmds, stderr=subprocess.PIPE)
self.qemupid = process.pid
- if process.wait():
- logger.error("Failed to run qemu: %s", process.stderr.read().decode())
+ retcode = process.wait()
+ if retcode:
+ if retcode == -signal.SIGTERM:
+ logger.info("Qemu terminated by SIGTERM")
+ else:
+ logger.error("Failed to run qemu: %s", process.stderr.read().decode())
def cleanup(self):
if self.cleaned:
@@ -1310,6 +1316,7 @@ def main():
logger.info("SIGTERM received")
os.kill(config.qemupid, signal.SIGTERM)
config.cleanup()
+ subprocess.run(["tput", "smam"])
signal.signal(signal.SIGTERM, sigterm_handler)
config.check_args()
@@ -1331,6 +1338,7 @@ def main():
return 1
finally:
config.cleanup()
+ subprocess.run(["tput", "smam"])
if __name__ == "__main__":
sys.exit(main())