[OE-core] [PATCH 1/1] runqemu: fix handling of SIGTERM and the problem of line wrapping

Burton, Ross ross.burton at intel.com
Fri Sep 21 15:05:48 UTC 2018


Is there a good reason why shell=True is used in the first place?
Just change the cmd to a list, stop passing shell=True, and you don't
need to dance around process groups.

Ross
On Fri, 21 Sep 2018 at 03:30, Chen Qi <Qi.Chen at windriver.com> wrote:
>
> 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 binary. So fix to send SIGTERM to the process group of runqemu.
> This ensures that all processes in the same process group, including the
> shell and the qemu process, will receive SIGTERM.
>
> 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 at windriver.com>
> ---
>  scripts/runqemu | 14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/runqemu b/scripts/runqemu
> index 409d17c..bc2aba5 100755
> --- a/scripts/runqemu
> +++ b/scripts/runqemu
> @@ -1213,9 +1213,12 @@ class BaseConfig(object):
>          cmd = "%s %s" % (self.qemu_opt, kernel_opts)
>          logger.info('Running %s\n' % cmd)
>          process = subprocess.Popen(cmd, shell=True, 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:
> @@ -1308,8 +1311,10 @@ def main():
>
>          def sigterm_handler(signum, frame):
>              logger.info("SIGTERM received")
> -            os.kill(config.qemupid, signal.SIGTERM)
> +            signal.signal(signal.SIGTERM, signal.SIG_IGN)
> +            os.kill(0, signal.SIGTERM)
>              config.cleanup()
> +            subprocess.run(["tput", "smam"])
>          signal.signal(signal.SIGTERM, sigterm_handler)
>
>          config.check_args()
> @@ -1331,6 +1336,7 @@ def main():
>          return 1
>      finally:
>          config.cleanup()
> +        subprocess.run(["tput", "smam"])
>
>  if __name__ == "__main__":
>      sys.exit(main())
> --
> 1.9.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core



More information about the Openembedded-core mailing list