[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [OSSTEST PATCH] standalone-generate-dump-flight-runvars: Handle ^C properly



On Fri, 2015-10-09 at 18:13 +0100, Ian Jackson wrote:
> This is all mad.

No kidding!

It doesn't appear to be possible to call setsid() from a shell script
(other than by re-execing oneself), which is a shame.

I wonder at what point we should just rewrite the whole thing in Perl?
Anyway right now:

> Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>

Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

> ---
>  standalone-generate-dump-flight-runvars |   24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/standalone-generate-dump-flight-runvars b/standalone
> -generate-dump-flight-runvars
> index a1907b0..efedd5c 100755
> --- a/standalone-generate-dump-flight-runvars
> +++ b/standalone-generate-dump-flight-runvars
> @@ -58,8 +58,32 @@ perbranch () {
>      flight=check_${branch//[-._]/_}
>  }
>  
> +# Good grief, handling background proceesses from shell is a pain.

"processes"

> +#
> +# For stupid historical reasons, background processes start with
> +# SIGINT (and QUIT) ignored (SuSv3 2.11).  bash does not offer a
> +# way to ask it not to do this.
> +#
> +# There is no way to reset this in bash (bash 4.2.37 manpage section
> +# on `trap' builtin), so we use perl.  However, there is still a race:
> +# if the signal arrives just after the fork, after the shell has (in
> +# the child) set it to to IGN, but before Perl has put it back, the
> +# child might still escape.  So in the child we check our parent.
> +#
> +# I _think_ that that any signal which arrives before the assignment
> +# to $SIG{} will definitely have caused our parent to vanish and us to
> +# be reparented to pid 1 by the time we do the getppid check.  But TBH
> +# I can't find any clear support for this requirement.  So the result
> +# may still be slightly racy in the case that s-g-d-f-r is ^C'd right
> +# after starting.

Based on your followup I guess you might want to clarify this?

> +
>  for branch in $@; do
>      perbranch
> +    perl -e '
> +        $SIG{$_}=DFL foreach qw(INT QUIT HUP);
> +     kill 1, $$ unless getppid=='$$';
> +     exec @ARGV or die $!;
> +    ' \
>      ./standalone make-flight -f $flight $branch >$log 2>&1 &
>      procs+=" $branch=$!"
>  done

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.